aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-04-01 13:44:19 -0400
committerAndrew Kelley <andrew@ziglang.org>2020-04-01 13:44:19 -0400
commitc2e8788259efd33995e151ace355cb5896cc8a85 (patch)
tree7962a47dd9df3976a7aa8c8c5ad754d27dd55ba4 /src
parente8a1e2a1d8f2903d5951339f7d3e0dbdfc85704c (diff)
parent2e806682f451efd26bef0486ddd980ab60de0fa1 (diff)
downloadzig-c2e8788259efd33995e151ace355cb5896cc8a85.tar.gz
zig-c2e8788259efd33995e151ace355cb5896cc8a85.zip
Merge branch 'daurnimator-less-buffer'
closes #4665
Diffstat (limited to 'src')
-rw-r--r--src/cache_hash.cpp8
-rw-r--r--src/cache_hash.hpp1
-rw-r--r--src/codegen.cpp30
-rw-r--r--src/link.cpp27
4 files changed, 47 insertions, 19 deletions
diff --git a/src/cache_hash.cpp b/src/cache_hash.cpp
index 3cff34ea5c..c12d8f29ef 100644
--- a/src/cache_hash.cpp
+++ b/src/cache_hash.cpp
@@ -27,11 +27,17 @@ void cache_init(CacheHash *ch, Buf *manifest_dir) {
void cache_mem(CacheHash *ch, const char *ptr, size_t len) {
assert(ch->manifest_file_path == nullptr);
assert(ptr != nullptr);
- // + 1 to include the null byte
blake2b_update(&ch->blake, ptr, len);
}
+void cache_slice(CacheHash *ch, Slice<const char> slice) {
+ // mix the length into the hash so that two juxtaposed cached slices can't collide
+ cache_usize(ch, slice.len);
+ cache_mem(ch, slice.ptr, slice.len);
+}
+
void cache_str(CacheHash *ch, const char *ptr) {
+ // + 1 to include the null byte
cache_mem(ch, ptr, strlen(ptr) + 1);
}
diff --git a/src/cache_hash.hpp b/src/cache_hash.hpp
index 9e4c41b1e0..ba2434076a 100644
--- a/src/cache_hash.hpp
+++ b/src/cache_hash.hpp
@@ -36,6 +36,7 @@ void cache_init(CacheHash *ch, Buf *manifest_dir);
// Next, use the hash population functions to add the initial parameters.
void cache_mem(CacheHash *ch, const char *ptr, size_t len);
+void cache_slice(CacheHash *ch, Slice<const char> slice);
void cache_str(CacheHash *ch, const char *ptr);
void cache_int(CacheHash *ch, int x);
void cache_bool(CacheHash *ch, bool x);
diff --git a/src/codegen.cpp b/src/codegen.cpp
index d36e398bf7..24e77e8689 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -9123,21 +9123,29 @@ static void detect_libc(CodeGen *g) {
g->libc_include_dir_len = 0;
g->libc_include_dir_list = heap::c_allocator.allocate<const char *>(dir_count);
- g->libc_include_dir_list[g->libc_include_dir_len] = g->libc->include_dir;
+ g->libc_include_dir_list[g->libc_include_dir_len] = buf_ptr(buf_create_from_mem(
+ g->libc->include_dir, g->libc->include_dir_len));
g->libc_include_dir_len += 1;
if (want_sys_dir) {
- g->libc_include_dir_list[g->libc_include_dir_len] = g->libc->sys_include_dir;
+ g->libc_include_dir_list[g->libc_include_dir_len] = buf_ptr(buf_create_from_mem(
+ g->libc->sys_include_dir, g->libc->sys_include_dir_len));
g->libc_include_dir_len += 1;
}
if (want_um_and_shared_dirs != 0) {
- g->libc_include_dir_list[g->libc_include_dir_len] = buf_ptr(buf_sprintf(
- "%s" OS_SEP ".." OS_SEP "um", g->libc->include_dir));
+ Buf *include_dir_parent = buf_alloc();
+ os_path_join(buf_create_from_mem(g->libc->include_dir, g->libc->include_dir_len),
+ buf_create_from_str(".."), include_dir_parent);
+
+ Buf *buff1 = buf_alloc();
+ os_path_join(include_dir_parent, buf_create_from_str("um"), buff1);
+ g->libc_include_dir_list[g->libc_include_dir_len] = buf_ptr(buff1);
g->libc_include_dir_len += 1;
- g->libc_include_dir_list[g->libc_include_dir_len] = buf_ptr(buf_sprintf(
- "%s" OS_SEP ".." OS_SEP "shared", g->libc->include_dir));
+ Buf *buff2 = buf_alloc();
+ os_path_join(include_dir_parent, buf_create_from_str("shared"), buff2);
+ g->libc_include_dir_list[g->libc_include_dir_len] = buf_ptr(buff2);
g->libc_include_dir_len += 1;
}
assert(g->libc_include_dir_len == dir_count);
@@ -10546,11 +10554,11 @@ static Error check_cache(CodeGen *g, Buf *manifest_dir, Buf *digest) {
cache_list_of_str(ch, g->lib_dirs.items, g->lib_dirs.length);
cache_list_of_str(ch, g->framework_dirs.items, g->framework_dirs.length);
if (g->libc) {
- cache_str(ch, g->libc->include_dir);
- cache_str(ch, g->libc->sys_include_dir);
- cache_str(ch, g->libc->crt_dir);
- cache_str(ch, g->libc->msvc_lib_dir);
- cache_str(ch, g->libc->kernel32_lib_dir);
+ cache_slice(ch, Slice<const char>{g->libc->include_dir, g->libc->include_dir_len});
+ cache_slice(ch, Slice<const char>{g->libc->sys_include_dir, g->libc->sys_include_dir_len});
+ cache_slice(ch, Slice<const char>{g->libc->crt_dir, g->libc->crt_dir_len});
+ cache_slice(ch, Slice<const char>{g->libc->msvc_lib_dir, g->libc->msvc_lib_dir_len});
+ cache_slice(ch, Slice<const char>{g->libc->kernel32_lib_dir, g->libc->kernel32_lib_dir_len});
}
cache_buf_opt(ch, g->version_script_path);
cache_buf_opt(ch, g->override_soname);
diff --git a/src/link.cpp b/src/link.cpp
index 0d7a8a410b..fba572de98 100644
--- a/src/link.cpp
+++ b/src/link.cpp
@@ -1595,7 +1595,8 @@ static const char *get_libc_crt_file(CodeGen *parent, const char *file, Stage2Pr
} else {
assert(parent->libc != nullptr);
Buf *out_buf = buf_alloc();
- os_path_join(buf_create_from_str(parent->libc->crt_dir), buf_create_from_str(file), out_buf);
+ os_path_join(buf_create_from_mem(parent->libc->crt_dir, parent->libc->crt_dir_len),
+ buf_create_from_str(file), out_buf);
return buf_ptr(out_buf);
}
}
@@ -1860,7 +1861,7 @@ static void construct_linker_job_elf(LinkJob *lj) {
if (g->libc_link_lib != nullptr) {
if (g->libc != nullptr) {
lj->args.append("-L");
- lj->args.append(g->libc->crt_dir);
+ lj->args.append(buf_ptr(buf_create_from_mem(g->libc->crt_dir, g->libc->crt_dir_len)));
}
if (g->have_dynamic_link && (is_dyn_lib || g->out_type == OutTypeExe)) {
@@ -2381,14 +2382,26 @@ static void construct_linker_job_coff(LinkJob *lj) {
lj->args.append(buf_ptr(buf_sprintf("-OUT:%s", buf_ptr(&g->bin_file_output_path))));
if (g->libc_link_lib != nullptr && g->libc != nullptr) {
- lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", g->libc->crt_dir)));
+ Buf *buff0 = buf_create_from_str("-LIBPATH:");
+ buf_append_mem(buff0, g->libc->crt_dir, g->libc->crt_dir_len);
+ lj->args.append(buf_ptr(buff0));
if (target_abi_is_gnu(g->zig_target->abi)) {
- lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", g->libc->sys_include_dir)));
- lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", g->libc->include_dir)));
+ Buf *buff1 = buf_create_from_str("-LIBPATH:");
+ buf_append_mem(buff1, g->libc->sys_include_dir, g->libc->sys_include_dir_len);
+ lj->args.append(buf_ptr(buff1));
+
+ Buf *buff2 = buf_create_from_str("-LIBPATH:");
+ buf_append_mem(buff2, g->libc->include_dir, g->libc->include_dir_len);
+ lj->args.append(buf_ptr(buff2));
} else {
- lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", g->libc->msvc_lib_dir)));
- lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", g->libc->kernel32_lib_dir)));
+ Buf *buff1 = buf_create_from_str("-LIBPATH:");
+ buf_append_mem(buff1, g->libc->msvc_lib_dir, g->libc->msvc_lib_dir_len);
+ lj->args.append(buf_ptr(buff1));
+
+ Buf *buff2 = buf_create_from_str("-LIBPATH:");
+ buf_append_mem(buff2, g->libc->kernel32_lib_dir, g->libc->kernel32_lib_dir_len);
+ lj->args.append(buf_ptr(buff2));
}
}