From 5771bd805ee48aca5d56088fb8a1449bb7c3760d Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 13 Feb 2016 23:03:16 -0700 Subject: [PATCH] respect link order in source code --- src/all_types.hpp | 2 +- src/codegen.cpp | 4 ++-- src/link.cpp | 21 ++++++++++----------- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/all_types.hpp b/src/all_types.hpp index 894be41b2..07218a40d 100644 --- a/src/all_types.hpp +++ b/src/all_types.hpp @@ -1061,9 +1061,9 @@ struct CodeGen { LLVMZigDICompileUnit *compile_unit; ZigList lib_search_paths; + ZigList link_libs; // reminder: hash tables must be initialized before use - HashMap link_table; HashMap import_table; HashMap builtin_fn_table; HashMap primitive_type_table; diff --git a/src/codegen.cpp b/src/codegen.cpp index 7cfd699ce..f7b05bf37 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -24,7 +24,6 @@ CodeGen *codegen_create(Buf *root_source_dir, const ZigTarget *target) { CodeGen *g = allocate(1); - g->link_table.init(32); g->import_table.init(32); g->builtin_fn_table.init(32); g->primitive_type_table.init(32); @@ -3831,9 +3830,10 @@ static ImportTableEntry *codegen_add_code(CodeGen *g, Buf *abs_full_path, if (buf_eql_str(name, "version")) { set_root_export_version(g, param, directive_node); } else if (buf_eql_str(name, "link")) { - g->link_table.put(param, true); if (buf_eql_str(param, "c")) { g->link_libc = true; + } else { + g->link_libs.append(param); } } else { add_node_error(g, directive_node, diff --git a/src/link.cpp b/src/link.cpp index 5d684c46e..5fbcdfefb 100644 --- a/src/link.cpp +++ b/src/link.cpp @@ -210,17 +210,10 @@ static void construct_linker_job_linux(LinkJob *lj) { lj->args.append(buf_ptr(compiler_rt_o_path)); } - auto it = g->link_table.entry_iterator(); - for (;;) { - auto *entry = it.next(); - if (!entry) - break; - - // we handle libc explicitly, don't do it here - if (!buf_eql_str(entry->key, "c")) { - Buf *arg = buf_sprintf("-l%s", buf_ptr(entry->key)); - lj->args.append(buf_ptr(arg)); - } + for (int i = 0; i < g->link_libs.length; i += 1) { + Buf *link_lib = g->link_libs.at(i); + Buf *arg = buf_sprintf("-l%s", buf_ptr(link_lib)); + lj->args.append(buf_ptr(arg)); } @@ -333,6 +326,12 @@ static void construct_linker_job_mingw(LinkJob *lj) { lj->args.append((const char *)buf_ptr(&lj->out_file_o)); + for (int i = 0; i < g->link_libs.length; i += 1) { + Buf *link_lib = g->link_libs.at(i); + Buf *arg = buf_sprintf("-l%s", buf_ptr(link_lib)); + lj->args.append(buf_ptr(arg)); + } + if (g->link_libc) { if (g->is_static) { lj->args.append("--start-group");