From f727214db0677ebc31e0988287c71c517a858193 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Mon, 12 Nov 2018 17:17:30 -0800 Subject: [PATCH] Use include_bytes! instead of incbin. This is the second attempt at this patch. The first version was reverted in 2ffd78daf9956a24098d1f959f21882e350e9d37 The problem, I suspect, was that the snapshot was represented as a source_set, which inserted a node into the dependency tree. include_bytes does properly insert the snapshot into rustc's depfile but the use of source_set confused gn. Now the that the deno executable has the create_deno_snapshot as a direct dependency, changes will be propagated. --- BUILD.gn | 88 ++++++++----------------------------------------- src/main.rs | 2 +- src/snapshot.cc | 18 ---------- src/snapshot.rs | 18 ++++++++-- 4 files changed, 30 insertions(+), 96 deletions(-) delete mode 100644 src/snapshot.cc diff --git a/BUILD.gn b/BUILD.gn index b5fc49dd7b..494b46830b 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -111,6 +111,14 @@ ts_sources = [ "third_party/yarn.lock", ] +group("deno_deps") { + deps = [ + ":create_snapshot_deno", + ":msg_rs", + "libdeno:libdeno", + ] +} + rust_executable("deno") { source_root = "src/main.rs" extern = main_extern @@ -119,51 +127,6 @@ rust_executable("deno") { ] } -source_set("snapshot") { - sources = [ - "src/snapshot.cc", - ] - configs += [ "libdeno:deno_config" ] - inputs = [ - "$target_gen_dir/snapshot_deno.bin", - ] - deps = [ - ":create_snapshot_deno", - ] - - # snapshot.cc doesn't need to depend on libdeno, it just needs deno_buf. - include_dirs = [ "libdeno/" ] - - # src/snapshot.cc uses an assembly '.incbin' directive to embed the snapshot. - # This causes trouble when using sccache: since the snapshot file is not - # inlined by the c preprocessor, sccache doesn't take its contents into - # consideration, leading to false-positive cache hits. - # Maybe other caching tools have this issue too, but ccache is unaffected. - # Therefore, if a cc_wrapper is used that isn't ccache, include a generated - # header file that contains the the sha256 hash of the snapshot. - if (cc_wrapper != "" && cc_wrapper != "ccache") { - hash_h = "$target_gen_dir/bundle/hash.h" - inputs += [ hash_h ] - deps += [ ":bundle_hash_h" ] - if (is_win) { - cflags = [ "/FI" + rebase_path(hash_h, target_out_dir) ] - } else { - cflags = [ - "-include", - rebase_path(hash_h, target_out_dir), - ] - } - } -} - -rust_executable("hyper_hello") { - source_root = "tools/hyper_hello.rs" - extern = [ - "$rust_build:hyper", - "$rust_build:ring", - ] -} - rust_test("test_rs") { source_root = "src/main.rs" extern = main_extern @@ -172,14 +135,12 @@ rust_test("test_rs") { ] } -v8_static_library("deno_deps") { - complete_static_lib = true - public_deps = [ - ":msg_rs", - ":snapshot", - "libdeno:libdeno", +rust_executable("hyper_hello") { + source_root = "tools/hyper_hello.rs" + extern = [ + "$rust_build:hyper", + "$rust_build:ring", ] - configs = [ "libdeno:deno_config" ] } # Generates the core TypeScript type library for deno that will be @@ -236,29 +197,6 @@ run_node("bundle") { ] } -action("bundle_hash_h") { - script = "//tools/sha256sum.py" - inputs = get_target_outputs(":bundle") - outputs = [ - "$target_gen_dir/bundle/hash.h", - ] - deps = [ - ":bundle", - ] - args = [ - "--format", - "__attribute__((__unused__)) static const int dummy_%s = 0;", - "--outfile", - rebase_path(outputs[0], root_build_dir), - ] - foreach(input, inputs) { - args += [ - "--infile", - rebase_path(input, root_build_dir), - ] - } -} - ts_flatbuffer("msg_ts") { sources = [ "src/msg.fbs", diff --git a/src/main.rs b/src/main.rs index 7c6806d5d1..1224d2af20 100644 --- a/src/main.rs +++ b/src/main.rs @@ -97,7 +97,7 @@ fn main() { }); let state = Arc::new(isolate::IsolateState::new(flags, rest_argv)); - let snapshot = unsafe { snapshot::deno_snapshot.clone() }; + let snapshot = snapshot::deno_snapshot(); let mut isolate = isolate::Isolate::new(snapshot, state, ops::dispatch); tokio_util::init(|| { isolate diff --git a/src/snapshot.cc b/src/snapshot.cc deleted file mode 100644 index b0945d319a..0000000000 --- a/src/snapshot.cc +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2018 the Deno authors. All rights reserved. MIT license. - -#include "deno.h" - -extern "C" { - -extern const char snapshot_start asm("snapshot_start"); -extern const char snapshot_end asm("snapshot_end"); -asm(".data\n" - "snapshot_start: .incbin \"gen/snapshot_deno.bin\"\n" - "snapshot_end:\n" - ".globl snapshot_start;\n" - ".globl snapshot_end;"); -extern const deno_buf deno_snapshot = { - nullptr, 0, reinterpret_cast(const_cast(&snapshot_start)), - static_cast(&snapshot_end - &snapshot_start)}; - -} diff --git a/src/snapshot.rs b/src/snapshot.rs index 52c8df47de..4774ba43f7 100644 --- a/src/snapshot.rs +++ b/src/snapshot.rs @@ -1,5 +1,19 @@ // Copyright 2018 the Deno authors. All rights reserved. MIT license. use libdeno::deno_buf; -extern "C" { - pub static deno_snapshot: deno_buf; +use std; + +pub fn deno_snapshot() -> deno_buf { + let data = + include_bytes!(concat!(env!("GN_OUT_DIR"), "/gen/snapshot_deno.bin")); + let ptr = data.as_ptr(); + // TODO The cast is not necessary here. deno_buf specifies mutable + // pointers when it doesn't necessarally need mutable. So maybe the deno_buf + // type should be broken into a mutable and non-mutable version? + let ptr_mut = ptr as *mut u8; + deno_buf { + alloc_ptr: std::ptr::null_mut(), + alloc_len: 0, + data_ptr: ptr_mut, + data_len: data.len(), + } }