authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-02-04 22:06:03-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-02-04 22:06:03-05:00
log21ce559c9c923e62a76ffda6c26d31ac2e062acb
tree9bd4a3a643b03abd59b6c139f83c0129b5b000d4
parent61718742f7f20cde1469d4db811cd6dd6c3f8266

add --forbid-library

to help track down accidentally linking against a library

7 files changed, 39 insertions(+), 16 deletions(-)

src/all_types.hpp+2
...@@ -1631,6 +1631,8 @@ struct CodeGen {...@@ -1631,6 +1631,8 @@ struct CodeGen {
1631 TypeTableEntry *ptr_to_stack_trace_type;1631 TypeTableEntry *ptr_to_stack_trace_type;
16321632
1633 ZigList<ZigLLVMDIType **> error_di_types;1633 ZigList<ZigLLVMDIType **> error_di_types;
1634
1635 ZigList<Buf *> forbidden_libs;
1634};1636};
16351637
1636enum VarLinkage {1638enum VarLinkage {
src/analyze.cpp-11
...@@ -5609,17 +5609,6 @@ LinkLib *add_link_lib(CodeGen *g, Buf *name) {...@@ -5609,17 +5609,6 @@ LinkLib *add_link_lib(CodeGen *g, Buf *name) {
5609 return link_lib;5609 return link_lib;
5610}5610}
56115611
5612void add_link_lib_symbol(CodeGen *g, Buf *lib_name, Buf *symbol_name) {
5613 LinkLib *link_lib = add_link_lib(g, lib_name);
5614 for (size_t i = 0; i < link_lib->symbols.length; i += 1) {
5615 Buf *existing_symbol_name = link_lib->symbols.at(i);
5616 if (buf_eql_buf(existing_symbol_name, symbol_name)) {
5617 return;
5618 }
5619 }
5620 link_lib->symbols.append(symbol_name);
5621}
5622
5623uint32_t get_abi_alignment(CodeGen *g, TypeTableEntry *type_entry) {5612uint32_t get_abi_alignment(CodeGen *g, TypeTableEntry *type_entry) {
5624 type_ensure_zero_bits_known(g, type_entry);5613 type_ensure_zero_bits_known(g, type_entry);
5625 if (type_entry->zero_bits) return 0;5614 if (type_entry->zero_bits) return 0;
src/analyze.hpp-1
...@@ -175,7 +175,6 @@ bool type_is_copyable(CodeGen *g, TypeTableEntry *type_entry);...@@ -175,7 +175,6 @@ bool type_is_copyable(CodeGen *g, TypeTableEntry *type_entry);
175LinkLib *create_link_lib(Buf *name);175LinkLib *create_link_lib(Buf *name);
176bool calling_convention_does_first_arg_return(CallingConvention cc);176bool calling_convention_does_first_arg_return(CallingConvention cc);
177LinkLib *add_link_lib(CodeGen *codegen, Buf *lib);177LinkLib *add_link_lib(CodeGen *codegen, Buf *lib);
178void add_link_lib_symbol(CodeGen *g, Buf *lib_name, Buf *symbol_name);
179178
180uint32_t get_abi_alignment(CodeGen *g, TypeTableEntry *type_entry);179uint32_t get_abi_alignment(CodeGen *g, TypeTableEntry *type_entry);
181TypeTableEntry *get_align_amt_type(CodeGen *g);180TypeTableEntry *get_align_amt_type(CodeGen *g);
src/codegen.cpp+5
...@@ -253,6 +253,10 @@ LinkLib *codegen_add_link_lib(CodeGen *g, Buf *name) {...@@ -253,6 +253,10 @@ LinkLib *codegen_add_link_lib(CodeGen *g, Buf *name) {
253 return add_link_lib(g, name);253 return add_link_lib(g, name);
254}254}
255255
256void codegen_add_forbidden_lib(CodeGen *codegen, Buf *lib) {
257 codegen->forbidden_libs.append(lib);
258}
259
256void codegen_add_framework(CodeGen *g, const char *framework) {260void codegen_add_framework(CodeGen *g, const char *framework) {
257 g->darwin_frameworks.append(buf_create_from_str(framework));261 g->darwin_frameworks.append(buf_create_from_str(framework));
258}262}
...@@ -6311,3 +6315,4 @@ PackageTableEntry *codegen_create_package(CodeGen *g, const char *root_src_dir,...@@ -6311,3 +6315,4 @@ PackageTableEntry *codegen_create_package(CodeGen *g, const char *root_src_dir,
6311 }6315 }
6312 return pkg;6316 return pkg;
6313}6317}
6318
src/codegen.hpp+1
...@@ -36,6 +36,7 @@ void codegen_set_kernel32_lib_dir(CodeGen *codegen, Buf *kernel32_lib_dir);...@@ -36,6 +36,7 @@ void codegen_set_kernel32_lib_dir(CodeGen *codegen, Buf *kernel32_lib_dir);
36void codegen_set_dynamic_linker(CodeGen *g, Buf *dynamic_linker);36void codegen_set_dynamic_linker(CodeGen *g, Buf *dynamic_linker);
37void codegen_set_windows_subsystem(CodeGen *g, bool mwindows, bool mconsole);37void codegen_set_windows_subsystem(CodeGen *g, bool mwindows, bool mconsole);
38void codegen_add_lib_dir(CodeGen *codegen, const char *dir);38void codegen_add_lib_dir(CodeGen *codegen, const char *dir);
39void codegen_add_forbidden_lib(CodeGen *codegen, Buf *lib);
39LinkLib *codegen_add_link_lib(CodeGen *codegen, Buf *lib);40LinkLib *codegen_add_link_lib(CodeGen *codegen, Buf *lib);
40void codegen_add_framework(CodeGen *codegen, const char *name);41void codegen_add_framework(CodeGen *codegen, const char *name);
41void codegen_add_rpath(CodeGen *codegen, const char *name);42void codegen_add_rpath(CodeGen *codegen, const char *name);
src/ir.cpp+23-4
...@@ -11762,6 +11762,25 @@ static TypeTableEntry *ir_analyze_container_field_ptr(IrAnalyze *ira, Buf *field...@@ -11762,6 +11762,25 @@ static TypeTableEntry *ir_analyze_container_field_ptr(IrAnalyze *ira, Buf *field
11762 }11762 }
11763}11763}
1176411764
11765static void add_link_lib_symbol(IrAnalyze *ira, Buf *lib_name, Buf *symbol_name, AstNode *source_node) {
11766 LinkLib *link_lib = add_link_lib(ira->codegen, lib_name);
11767 for (size_t i = 0; i < link_lib->symbols.length; i += 1) {
11768 Buf *existing_symbol_name = link_lib->symbols.at(i);
11769 if (buf_eql_buf(existing_symbol_name, symbol_name)) {
11770 return;
11771 }
11772 }
11773 for (size_t i = 0; i < ira->codegen->forbidden_libs.length; i += 1) {
11774 Buf *forbidden_lib_name = ira->codegen->forbidden_libs.at(i);
11775 if (buf_eql_buf(lib_name, forbidden_lib_name)) {
11776 ir_add_error_node(ira, source_node,
11777 buf_sprintf("linking against forbidden library '%s'", buf_ptr(symbol_name)));
11778 }
11779 }
11780 link_lib->symbols.append(symbol_name);
11781}
11782
11783
11765static TypeTableEntry *ir_analyze_decl_ref(IrAnalyze *ira, IrInstruction *source_instruction, Tld *tld) {11784static TypeTableEntry *ir_analyze_decl_ref(IrAnalyze *ira, IrInstruction *source_instruction, Tld *tld) {
11766 bool pointer_only = false;11785 bool pointer_only = false;
11767 resolve_top_level_decl(ira->codegen, tld, pointer_only, source_instruction->source_node);11786 resolve_top_level_decl(ira->codegen, tld, pointer_only, source_instruction->source_node);
...@@ -11777,7 +11796,7 @@ static TypeTableEntry *ir_analyze_decl_ref(IrAnalyze *ira, IrInstruction *source...@@ -11777,7 +11796,7 @@ static TypeTableEntry *ir_analyze_decl_ref(IrAnalyze *ira, IrInstruction *source
11777 TldVar *tld_var = (TldVar *)tld;11796 TldVar *tld_var = (TldVar *)tld;
11778 VariableTableEntry *var = tld_var->var;11797 VariableTableEntry *var = tld_var->var;
11779 if (tld_var->extern_lib_name != nullptr) {11798 if (tld_var->extern_lib_name != nullptr) {
11780 add_link_lib_symbol(ira->codegen, tld_var->extern_lib_name, &var->name);11799 add_link_lib_symbol(ira, tld_var->extern_lib_name, &var->name, source_instruction->source_node);
11781 }11800 }
1178211801
11783 return ir_analyze_var_ptr(ira, source_instruction, var, false, false);11802 return ir_analyze_var_ptr(ira, source_instruction, var, false, false);
...@@ -11799,7 +11818,7 @@ static TypeTableEntry *ir_analyze_decl_ref(IrAnalyze *ira, IrInstruction *source...@@ -11799,7 +11818,7 @@ static TypeTableEntry *ir_analyze_decl_ref(IrAnalyze *ira, IrInstruction *source
11799 const_val->data.x_fn.fn_entry = fn_entry;11818 const_val->data.x_fn.fn_entry = fn_entry;
1180011819
11801 if (tld_fn->extern_lib_name != nullptr) {11820 if (tld_fn->extern_lib_name != nullptr) {
11802 add_link_lib_symbol(ira->codegen, tld_fn->extern_lib_name, &fn_entry->symbol_name);11821 add_link_lib_symbol(ira, tld_fn->extern_lib_name, &fn_entry->symbol_name, source_instruction->source_node);
11803 }11822 }
1180411823
11805 bool ptr_is_const = true;11824 bool ptr_is_const = true;
...@@ -15839,7 +15858,7 @@ static TypeTableEntry *ir_analyze_instruction_decl_ref(IrAnalyze *ira,...@@ -15839,7 +15858,7 @@ static TypeTableEntry *ir_analyze_instruction_decl_ref(IrAnalyze *ira,
15839 return ira->codegen->builtin_types.entry_invalid;15858 return ira->codegen->builtin_types.entry_invalid;
1584015859
15841 if (tld_var->extern_lib_name != nullptr) {15860 if (tld_var->extern_lib_name != nullptr) {
15842 add_link_lib_symbol(ira->codegen, tld_var->extern_lib_name, &var->name);15861 add_link_lib_symbol(ira, tld_var->extern_lib_name, &var->name, instruction->base.source_node);
15843 }15862 }
1584415863
15845 if (lval.is_ptr) {15864 if (lval.is_ptr) {
...@@ -15858,7 +15877,7 @@ static TypeTableEntry *ir_analyze_instruction_decl_ref(IrAnalyze *ira,...@@ -15858,7 +15877,7 @@ static TypeTableEntry *ir_analyze_instruction_decl_ref(IrAnalyze *ira,
15858 assert(fn_entry->type_entry);15877 assert(fn_entry->type_entry);
1585915878
15860 if (tld_fn->extern_lib_name != nullptr) {15879 if (tld_fn->extern_lib_name != nullptr) {
15861 add_link_lib_symbol(ira->codegen, tld_fn->extern_lib_name, &fn_entry->symbol_name);15880 add_link_lib_symbol(ira, tld_fn->extern_lib_name, &fn_entry->symbol_name, instruction->base.source_node);
15862 }15881 }
1586315882
15864 IrInstruction *ref_instruction = ir_create_const_fn(&ira->new_irb, instruction->base.scope,15883 IrInstruction *ref_instruction = ir_create_const_fn(&ira->new_irb, instruction->base.scope,
src/main.cpp+8
...@@ -66,6 +66,7 @@ static int usage(const char *arg0) {...@@ -66,6 +66,7 @@ static int usage(const char *arg0) {
66 " --msvc-lib-dir [path] (windows) directory where vcruntime.lib resides\n"66 " --msvc-lib-dir [path] (windows) directory where vcruntime.lib resides\n"
67 " --kernel32-lib-dir [path] (windows) directory where kernel32.lib resides\n"67 " --kernel32-lib-dir [path] (windows) directory where kernel32.lib resides\n"
68 " --library [lib] link against lib\n"68 " --library [lib] link against lib\n"
69 " --forbid-library [lib] make it an error to link against lib\n"
69 " --library-path [dir] add a directory to the library search path\n"70 " --library-path [dir] add a directory to the library search path\n"
70 " --linker-script [path] use a custom linker script\n"71 " --linker-script [path] use a custom linker script\n"
71 " --object [obj] add object file to build\n"72 " --object [obj] add object file to build\n"
...@@ -309,6 +310,7 @@ int main(int argc, char **argv) {...@@ -309,6 +310,7 @@ int main(int argc, char **argv) {
309 ZigList<const char *> llvm_argv = {0};310 ZigList<const char *> llvm_argv = {0};
310 ZigList<const char *> lib_dirs = {0};311 ZigList<const char *> lib_dirs = {0};
311 ZigList<const char *> link_libs = {0};312 ZigList<const char *> link_libs = {0};
313 ZigList<const char *> forbidden_link_libs = {0};
312 ZigList<const char *> frameworks = {0};314 ZigList<const char *> frameworks = {0};
313 int err;315 int err;
314 const char *target_arch = nullptr;316 const char *target_arch = nullptr;
...@@ -592,6 +594,8 @@ int main(int argc, char **argv) {...@@ -592,6 +594,8 @@ int main(int argc, char **argv) {
592 lib_dirs.append(argv[i]);594 lib_dirs.append(argv[i]);
593 } else if (strcmp(arg, "--library") == 0) {595 } else if (strcmp(arg, "--library") == 0) {
594 link_libs.append(argv[i]);596 link_libs.append(argv[i]);
597 } else if (strcmp(arg, "--forbid-library") == 0) {
598 forbidden_link_libs.append(argv[i]);
595 } else if (strcmp(arg, "--object") == 0) {599 } else if (strcmp(arg, "--object") == 0) {
596 objects.append(argv[i]);600 objects.append(argv[i]);
597 } else if (strcmp(arg, "--assembly") == 0) {601 } else if (strcmp(arg, "--assembly") == 0) {
...@@ -804,6 +808,10 @@ int main(int argc, char **argv) {...@@ -804,6 +808,10 @@ int main(int argc, char **argv) {
804 LinkLib *link_lib = codegen_add_link_lib(g, buf_create_from_str(link_libs.at(i)));808 LinkLib *link_lib = codegen_add_link_lib(g, buf_create_from_str(link_libs.at(i)));
805 link_lib->provided_explicitly = true;809 link_lib->provided_explicitly = true;
806 }810 }
811 for (size_t i = 0; i < forbidden_link_libs.length; i += 1) {
812 Buf *forbidden_link_lib = buf_create_from_str(forbidden_link_libs.at(i));
813 codegen_add_forbidden_lib(g, forbidden_link_lib);
814 }
807 for (size_t i = 0; i < frameworks.length; i += 1) {815 for (size_t i = 0; i < frameworks.length; i += 1) {
808 codegen_add_framework(g, frameworks.at(i));816 codegen_add_framework(g, frameworks.at(i));
809 }817 }