Loading clang/lib/Driver/ToolChain.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -618,6 +618,8 @@ std::string ToolChain::GetLinkerPath(bool *LinkerIsLLD, std::string ToolChain::GetStaticLibToolPath() const { // TODO: Add support for static lib archiving on Windows if (Triple.isOSDarwin()) return GetProgramPath("libtool"); return GetProgramPath("llvm-ar"); } Loading clang/lib/Driver/ToolChains/Darwin.cpp +52 −0 Original line number Diff line number Diff line Loading @@ -729,6 +729,54 @@ void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA, C.addCommand(std::move(Cmd)); } void darwin::StaticLibTool::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const { const Driver &D = getToolChain().getDriver(); // Silence warning for "clang -g foo.o -o foo" Args.ClaimAllArgs(options::OPT_g_Group); // and "clang -emit-llvm foo.o -o foo" Args.ClaimAllArgs(options::OPT_emit_llvm); // and for "clang -w foo.o -o foo". Other warning options are already // handled somewhere else. Args.ClaimAllArgs(options::OPT_w); // Silence warnings when linking C code with a C++ '-stdlib' argument. Args.ClaimAllArgs(options::OPT_stdlib_EQ); // libtool <options> <output_file> <input_files> ArgStringList CmdArgs; // Create and insert file members with a deterministic index. CmdArgs.push_back("-static"); CmdArgs.push_back("-D"); CmdArgs.push_back("-no_warning_for_no_symbols"); CmdArgs.push_back("-o"); CmdArgs.push_back(Output.getFilename()); for (const auto &II : Inputs) { if (II.isFilename()) { CmdArgs.push_back(II.getFilename()); } } // Delete old output archive file if it already exists before generating a new // archive file. const auto *OutputFileName = Output.getFilename(); if (Output.isFilename() && llvm::sys::fs::exists(OutputFileName)) { if (std::error_code EC = llvm::sys::fs::remove(OutputFileName)) { D.Diag(diag::err_drv_unable_to_remove_file) << EC.message(); return; } } const char *Exec = Args.MakeArgString(getToolChain().GetStaticLibToolPath()); C.addCommand(std::make_unique<Command>(JA, *this, ResponseFileSupport::AtFileUTF8(), Exec, CmdArgs, Inputs, Output)); } void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, Loading Loading @@ -982,6 +1030,10 @@ Tool *MachO::getTool(Action::ActionClass AC) const { Tool *MachO::buildLinker() const { return new tools::darwin::Linker(*this); } Tool *MachO::buildStaticLibTool() const { return new tools::darwin::StaticLibTool(*this); } Tool *MachO::buildAssembler() const { return new tools::darwin::Assembler(*this); } Loading clang/lib/Driver/ToolChains/Darwin.h +15 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,20 @@ public: const char *LinkingOutput) const override; }; class LLVM_LIBRARY_VISIBILITY StaticLibTool : public MachOTool { public: StaticLibTool(const ToolChain &TC) : MachOTool("darwin::StaticLibTool", "static-lib-linker", TC) {} bool hasIntegratedCPP() const override { return false; } bool isLinkJob() const override { return true; } void ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const llvm::opt::ArgList &TCArgs, const char *LinkingOutput) const override; }; class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool { public: Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {} Loading Loading @@ -125,6 +139,7 @@ class LLVM_LIBRARY_VISIBILITY MachO : public ToolChain { protected: Tool *buildAssembler() const override; Tool *buildLinker() const override; Tool *buildStaticLibTool() const override; Tool *getTool(Action::ActionClass AC) const override; private: Loading clang/test/Driver/bindings.c +4 −0 Original line number Diff line number Diff line Loading @@ -27,3 +27,7 @@ // GNU StaticLibTool binding // RUN: %clang -target x86_64-linux-gnu -ccc-print-bindings --emit-static-lib %s 2>&1 | FileCheck %s --check-prefix=CHECK15 // CHECK15: "x86_64-unknown-linux-gnu" - "GNU::StaticLibTool", inputs: ["{{.*}}.o"], output: "a.out" // Darwin StaticLibTool binding // RUN: %clang -target i386-apple-darwin9 -ccc-print-bindings --emit-static-lib %s 2>&1 | FileCheck %s --check-prefix=CHECK16 // CHECK16: "i386-apple-darwin9" - "darwin::StaticLibTool", inputs: ["{{.*}}.o"], output: "a.out" clang/test/Driver/darwin-static-lib.c 0 → 100644 +5 −0 Original line number Diff line number Diff line // RUN: %clang -target i386-apple-darwin9 %s -### --emit-static-lib 2>&1 | FileCheck %s // CHECK: "{{.*}}libtool" "-static" "-D" "-no_warning_for_no_symbols" "-o" "a.out" "{{.*o}}" // RUN: %clang -target i386-apple-darwin9 %s -### --emit-static-lib -o libfoo.a 2>&1 | FileCheck %s --check-prefix=OUTPUT // OUTPUT: "{{.*}}libtool" "-static" "-D" "-no_warning_for_no_symbols" "-o" "libfoo.a" "{{.*o}}" Loading
clang/lib/Driver/ToolChain.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -618,6 +618,8 @@ std::string ToolChain::GetLinkerPath(bool *LinkerIsLLD, std::string ToolChain::GetStaticLibToolPath() const { // TODO: Add support for static lib archiving on Windows if (Triple.isOSDarwin()) return GetProgramPath("libtool"); return GetProgramPath("llvm-ar"); } Loading
clang/lib/Driver/ToolChains/Darwin.cpp +52 −0 Original line number Diff line number Diff line Loading @@ -729,6 +729,54 @@ void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA, C.addCommand(std::move(Cmd)); } void darwin::StaticLibTool::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const { const Driver &D = getToolChain().getDriver(); // Silence warning for "clang -g foo.o -o foo" Args.ClaimAllArgs(options::OPT_g_Group); // and "clang -emit-llvm foo.o -o foo" Args.ClaimAllArgs(options::OPT_emit_llvm); // and for "clang -w foo.o -o foo". Other warning options are already // handled somewhere else. Args.ClaimAllArgs(options::OPT_w); // Silence warnings when linking C code with a C++ '-stdlib' argument. Args.ClaimAllArgs(options::OPT_stdlib_EQ); // libtool <options> <output_file> <input_files> ArgStringList CmdArgs; // Create and insert file members with a deterministic index. CmdArgs.push_back("-static"); CmdArgs.push_back("-D"); CmdArgs.push_back("-no_warning_for_no_symbols"); CmdArgs.push_back("-o"); CmdArgs.push_back(Output.getFilename()); for (const auto &II : Inputs) { if (II.isFilename()) { CmdArgs.push_back(II.getFilename()); } } // Delete old output archive file if it already exists before generating a new // archive file. const auto *OutputFileName = Output.getFilename(); if (Output.isFilename() && llvm::sys::fs::exists(OutputFileName)) { if (std::error_code EC = llvm::sys::fs::remove(OutputFileName)) { D.Diag(diag::err_drv_unable_to_remove_file) << EC.message(); return; } } const char *Exec = Args.MakeArgString(getToolChain().GetStaticLibToolPath()); C.addCommand(std::make_unique<Command>(JA, *this, ResponseFileSupport::AtFileUTF8(), Exec, CmdArgs, Inputs, Output)); } void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, Loading Loading @@ -982,6 +1030,10 @@ Tool *MachO::getTool(Action::ActionClass AC) const { Tool *MachO::buildLinker() const { return new tools::darwin::Linker(*this); } Tool *MachO::buildStaticLibTool() const { return new tools::darwin::StaticLibTool(*this); } Tool *MachO::buildAssembler() const { return new tools::darwin::Assembler(*this); } Loading
clang/lib/Driver/ToolChains/Darwin.h +15 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,20 @@ public: const char *LinkingOutput) const override; }; class LLVM_LIBRARY_VISIBILITY StaticLibTool : public MachOTool { public: StaticLibTool(const ToolChain &TC) : MachOTool("darwin::StaticLibTool", "static-lib-linker", TC) {} bool hasIntegratedCPP() const override { return false; } bool isLinkJob() const override { return true; } void ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const llvm::opt::ArgList &TCArgs, const char *LinkingOutput) const override; }; class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool { public: Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {} Loading Loading @@ -125,6 +139,7 @@ class LLVM_LIBRARY_VISIBILITY MachO : public ToolChain { protected: Tool *buildAssembler() const override; Tool *buildLinker() const override; Tool *buildStaticLibTool() const override; Tool *getTool(Action::ActionClass AC) const override; private: Loading
clang/test/Driver/bindings.c +4 −0 Original line number Diff line number Diff line Loading @@ -27,3 +27,7 @@ // GNU StaticLibTool binding // RUN: %clang -target x86_64-linux-gnu -ccc-print-bindings --emit-static-lib %s 2>&1 | FileCheck %s --check-prefix=CHECK15 // CHECK15: "x86_64-unknown-linux-gnu" - "GNU::StaticLibTool", inputs: ["{{.*}}.o"], output: "a.out" // Darwin StaticLibTool binding // RUN: %clang -target i386-apple-darwin9 -ccc-print-bindings --emit-static-lib %s 2>&1 | FileCheck %s --check-prefix=CHECK16 // CHECK16: "i386-apple-darwin9" - "darwin::StaticLibTool", inputs: ["{{.*}}.o"], output: "a.out"
clang/test/Driver/darwin-static-lib.c 0 → 100644 +5 −0 Original line number Diff line number Diff line // RUN: %clang -target i386-apple-darwin9 %s -### --emit-static-lib 2>&1 | FileCheck %s // CHECK: "{{.*}}libtool" "-static" "-D" "-no_warning_for_no_symbols" "-o" "a.out" "{{.*o}}" // RUN: %clang -target i386-apple-darwin9 %s -### --emit-static-lib -o libfoo.a 2>&1 | FileCheck %s --check-prefix=OUTPUT // OUTPUT: "{{.*}}libtool" "-static" "-D" "-no_warning_for_no_symbols" "-o" "libfoo.a" "{{.*o}}"