authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-17 17:46:16-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-17 17:46:16-04:00
logb8ee3a8143c91bcc7ba5d7166dd88c217db89b25
treee9dde7cf42c1263c9da49798f89858f39ad60d12
parentfaaaf8832772108b240a277f984c9dbdd046f98e

add -mllvm support

useful for debugging crashes in llvm optimizer

6 files changed, 34 insertions(+), 0 deletions(-)

src/all_types.hpp+3
......@@ -1524,6 +1524,9 @@ struct CodeGen {
15241524 size_t clang_argv_len;
15251525 ZigList<const char *> lib_dirs;
15261526
1527 const char **llvm_argv;
1528 size_t llvm_argv_len;
1529
15271530 ZigList<FnTableEntry *> test_fns;
15281531 TypeTableEntry *test_fn_type;
15291532
src/codegen.cpp+16
......@@ -152,6 +152,11 @@ void codegen_set_clang_argv(CodeGen *g, const char **args, size_t len) {
152152 g->clang_argv_len = len;
153153}
154154
155void codegen_set_llvm_argv(CodeGen *g, const char **args, size_t len) {
156 g->llvm_argv = args;
157 g->llvm_argv_len = len;
158}
159
155160void codegen_set_omit_zigrt(CodeGen *g, bool omit_zigrt) {
156161 g->omit_zigrt = omit_zigrt;
157162}
......@@ -4918,6 +4923,17 @@ static void init(CodeGen *g) {
49184923 if (g->module)
49194924 return;
49204925
4926
4927 if (g->llvm_argv_len > 0) {
4928 const char **args = allocate_nonzero<const char *>(g->llvm_argv_len + 2);
4929 args[0] = "zig (LLVM option parsing)";
4930 for (size_t i = 0; i < g->llvm_argv_len; i += 1) {
4931 args[i + 1] = g->llvm_argv[i];
4932 }
4933 args[g->llvm_argv_len + 1] = nullptr;
4934 ZigLLVMParseCommandLineOptions(g->llvm_argv_len + 1, args);
4935 }
4936
49214937 if (g->is_test_build) {
49224938 g->windows_subsystem_windows = false;
49234939 g->windows_subsystem_console = true;
src/codegen.hpp+1
......@@ -17,6 +17,7 @@
1717CodeGen *codegen_create(Buf *root_src_path, const ZigTarget *target, OutType out_type, BuildMode build_mode);
1818
1919void codegen_set_clang_argv(CodeGen *codegen, const char **args, size_t len);
20void codegen_set_llvm_argv(CodeGen *codegen, const char **args, size_t len);
2021void codegen_set_is_test(CodeGen *codegen, bool is_test);
2122void codegen_set_each_lib_rpath(CodeGen *codegen, bool each_lib_rpath);
2223
src/main.cpp+8
......@@ -50,6 +50,7 @@ static int usage(const char *arg0) {
5050 " --zig-std-dir [path] directory where zig standard library resides\n"
5151 " -dirafter [dir] same as -isystem but do it last\n"
5252 " -isystem [dir] add additional search path for other .h files\n"
53 " -mllvm [arg] additional arguments to forward to LLVM's option processing\n"
5354 "Link Options:\n"
5455 " --ar-path [path] set the path to ar\n"
5556 " --dynamic-linker [path] set the path to ld.so\n"
......@@ -190,6 +191,7 @@ int main(int argc, char **argv) {
190191 const char *zig_std_dir = nullptr;
191192 const char *dynamic_linker = nullptr;
192193 ZigList<const char *> clang_argv = {0};
194 ZigList<const char *> llvm_argv = {0};
193195 ZigList<const char *> lib_dirs = {0};
194196 ZigList<const char *> link_libs = {0};
195197 ZigList<const char *> frameworks = {0};
......@@ -420,6 +422,11 @@ int main(int argc, char **argv) {
420422 } else if (strcmp(arg, "-dirafter") == 0) {
421423 clang_argv.append("-dirafter");
422424 clang_argv.append(argv[i]);
425 } else if (strcmp(arg, "-mllvm") == 0) {
426 clang_argv.append("-mllvm");
427 clang_argv.append(argv[i]);
428
429 llvm_argv.append(argv[i]);
423430 } else if (strcmp(arg, "--library-path") == 0 || strcmp(arg, "-L") == 0) {
424431 lib_dirs.append(argv[i]);
425432 } else if (strcmp(arg, "--library") == 0) {
......@@ -604,6 +611,7 @@ int main(int argc, char **argv) {
604611 codegen_set_each_lib_rpath(g, each_lib_rpath);
605612
606613 codegen_set_clang_argv(g, clang_argv.items, clang_argv.length);
614 codegen_set_llvm_argv(g, llvm_argv.items, llvm_argv.length);
607615 codegen_set_strip(g, strip);
608616 codegen_set_is_static(g, is_static);
609617 if (libc_lib_dir)
src/zig_llvm.cpp+4
......@@ -602,6 +602,10 @@ void ZigLLVMAddFunctionAttrCold(LLVMValueRef fn_ref) {
602602 func->setAttributes(new_attr_set);
603603}
604604
605void ZigLLVMParseCommandLineOptions(int argc, const char *const *argv) {
606 llvm::cl::ParseCommandLineOptions(argc, argv);
607}
608
605609
606610static_assert((Triple::ArchType)ZigLLVM_LastArchType == Triple::LastArchType, "");
607611static_assert((Triple::VendorType)ZigLLVM_LastVendorType == Triple::LastVendorType, "");
src/zig_llvm.hpp+2
......@@ -164,6 +164,8 @@ void ZigLLVMSetFastMath(LLVMBuilderRef builder_wrapped, bool on_state);
164164void ZigLLVMAddFunctionAttr(LLVMValueRef fn, const char *attr_name, const char *attr_value);
165165void ZigLLVMAddFunctionAttrCold(LLVMValueRef fn);
166166
167void ZigLLVMParseCommandLineOptions(int argc, const char *const *argv);
168
167169
168170// copied from include/llvm/ADT/Triple.h
169171