[PATCH] D109461: [clang][darwin] Add support for --emit-static-lib
This revision was automatically updated to reflect the committed changes. Closed by commit rG80d62993d072: [clang][darwin] Add support for --emit-static-lib (authored by keith). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D109461/new/ https://reviews.llvm.org/D109461 Files: clang/lib/Driver/ToolChain.cpp clang/lib/Driver/ToolChains/Darwin.cpp clang/lib/Driver/ToolChains/Darwin.h clang/test/Driver/bindings.c clang/test/Driver/darwin-static-lib.c Index: clang/test/Driver/darwin-static-lib.c === --- /dev/null +++ clang/test/Driver/darwin-static-lib.c @@ -0,0 +1,5 @@ +// 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}}" Index: clang/test/Driver/bindings.c === --- clang/test/Driver/bindings.c +++ clang/test/Driver/bindings.c @@ -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" Index: clang/lib/Driver/ToolChains/Darwin.h === --- clang/lib/Driver/ToolChains/Darwin.h +++ clang/lib/Driver/ToolChains/Darwin.h @@ -78,6 +78,20 @@ const char *LinkingOutput) const override; }; +class LLVM_LIBRARY_VISIBILITY StaticLibTool : public MachOTool { +public: + StaticLibTool(const ToolChain ) + : MachOTool("darwin::StaticLibTool", "static-lib-linker", TC) {} + + bool hasIntegratedCPP() const override { return false; } + bool isLinkJob() const override { return true; } + + void ConstructJob(Compilation , const JobAction , +const InputInfo , const InputInfoList , +const llvm::opt::ArgList , +const char *LinkingOutput) const override; +}; + class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool { public: Lipo(const ToolChain ) : MachOTool("darwin::Lipo", "lipo", TC) {} @@ -125,6 +139,7 @@ protected: Tool *buildAssembler() const override; Tool *buildLinker() const override; + Tool *buildStaticLibTool() const override; Tool *getTool(Action::ActionClass AC) const override; private: Index: clang/lib/Driver/ToolChains/Darwin.cpp === --- clang/lib/Driver/ToolChains/Darwin.cpp +++ clang/lib/Driver/ToolChains/Darwin.cpp @@ -729,6 +729,54 @@ C.addCommand(std::move(Cmd)); } +void darwin::StaticLibTool::ConstructJob(Compilation , const JobAction , + const InputInfo , + const InputInfoList , + const ArgList , + const char *LinkingOutput) const { + const Driver = 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 + 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 : 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(JA,
[PATCH] D109461: [clang][darwin] Add support for --emit-static-lib
yaxunl accepted this revision. yaxunl added a comment. This revision is now accepted and ready to land. LGTM. Thanks. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D109461/new/ https://reviews.llvm.org/D109461 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D109461: [clang][darwin] Add support for --emit-static-lib
keith updated this revision to Diff 372287. keith added a comment. Revert unrelated formatting fixes Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D109461/new/ https://reviews.llvm.org/D109461 Files: clang/lib/Driver/ToolChain.cpp clang/lib/Driver/ToolChains/Darwin.cpp clang/lib/Driver/ToolChains/Darwin.h clang/test/Driver/bindings.c clang/test/Driver/darwin-static-lib.c Index: clang/test/Driver/darwin-static-lib.c === --- /dev/null +++ clang/test/Driver/darwin-static-lib.c @@ -0,0 +1,5 @@ +// 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}}" Index: clang/test/Driver/bindings.c === --- clang/test/Driver/bindings.c +++ clang/test/Driver/bindings.c @@ -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" Index: clang/lib/Driver/ToolChains/Darwin.h === --- clang/lib/Driver/ToolChains/Darwin.h +++ clang/lib/Driver/ToolChains/Darwin.h @@ -78,6 +78,20 @@ const char *LinkingOutput) const override; }; +class LLVM_LIBRARY_VISIBILITY StaticLibTool : public MachOTool { +public: + StaticLibTool(const ToolChain ) + : MachOTool("darwin::StaticLibTool", "static-lib-linker", TC) {} + + bool hasIntegratedCPP() const override { return false; } + bool isLinkJob() const override { return true; } + + void ConstructJob(Compilation , const JobAction , +const InputInfo , const InputInfoList , +const llvm::opt::ArgList , +const char *LinkingOutput) const override; +}; + class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool { public: Lipo(const ToolChain ) : MachOTool("darwin::Lipo", "lipo", TC) {} @@ -125,6 +139,7 @@ protected: Tool *buildAssembler() const override; Tool *buildLinker() const override; + Tool *buildStaticLibTool() const override; Tool *getTool(Action::ActionClass AC) const override; private: Index: clang/lib/Driver/ToolChains/Darwin.cpp === --- clang/lib/Driver/ToolChains/Darwin.cpp +++ clang/lib/Driver/ToolChains/Darwin.cpp @@ -729,6 +729,54 @@ C.addCommand(std::move(Cmd)); } +void darwin::StaticLibTool::ConstructJob(Compilation , const JobAction , + const InputInfo , + const InputInfoList , + const ArgList , + const char *LinkingOutput) const { + const Driver = 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 + 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 : 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(JA, *this, +
[PATCH] D109461: [clang][darwin] Add support for --emit-static-lib
keith updated this revision to Diff 372286. keith marked an inline comment as done. keith added a comment. Fix formatting and comment Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D109461/new/ https://reviews.llvm.org/D109461 Files: clang/lib/Driver/ToolChain.cpp clang/lib/Driver/ToolChains/Darwin.cpp clang/lib/Driver/ToolChains/Darwin.h clang/test/Driver/bindings.c clang/test/Driver/darwin-static-lib.c Index: clang/test/Driver/darwin-static-lib.c === --- /dev/null +++ clang/test/Driver/darwin-static-lib.c @@ -0,0 +1,5 @@ +// 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}}" Index: clang/test/Driver/bindings.c === --- clang/test/Driver/bindings.c +++ clang/test/Driver/bindings.c @@ -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" Index: clang/lib/Driver/ToolChains/Darwin.h === --- clang/lib/Driver/ToolChains/Darwin.h +++ clang/lib/Driver/ToolChains/Darwin.h @@ -78,6 +78,20 @@ const char *LinkingOutput) const override; }; +class LLVM_LIBRARY_VISIBILITY StaticLibTool : public MachOTool { +public: + StaticLibTool(const ToolChain ) + : MachOTool("darwin::StaticLibTool", "static-lib-linker", TC) {} + + bool hasIntegratedCPP() const override { return false; } + bool isLinkJob() const override { return true; } + + void ConstructJob(Compilation , const JobAction , +const InputInfo , const InputInfoList , +const llvm::opt::ArgList , +const char *LinkingOutput) const override; +}; + class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool { public: Lipo(const ToolChain ) : MachOTool("darwin::Lipo", "lipo", TC) {} @@ -125,6 +139,7 @@ protected: Tool *buildAssembler() const override; Tool *buildLinker() const override; + Tool *buildStaticLibTool() const override; Tool *getTool(Action::ActionClass AC) const override; private: Index: clang/lib/Driver/ToolChains/Darwin.cpp === --- clang/lib/Driver/ToolChains/Darwin.cpp +++ clang/lib/Driver/ToolChains/Darwin.cpp @@ -196,8 +196,8 @@ return true; if (A->getOption().matches(options::OPT_O)) return llvm::StringSwitch(A->getValue()) -.Case("1", true) -.Default(false); + .Case("1", true) + .Default(false); return false; // OPT_Ofast & OPT_O4 } @@ -296,8 +296,8 @@ if ((A = Args.getLastArg(options::OPT_compatibility__version)) || (A = Args.getLastArg(options::OPT_current__version)) || (A = Args.getLastArg(options::OPT_install__name))) - D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args) - << "-dynamiclib"; + D.Diag(diag::err_drv_argument_only_allowed_with) + << A->getAsString(Args) << "-dynamiclib"; Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace); Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs); @@ -312,8 +312,8 @@ (A = Args.getLastArg(options::OPT_force__flat__namespace)) || (A = Args.getLastArg(options::OPT_keep__private__externs)) || (A = Args.getLastArg(options::OPT_private__bundle))) - D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args) - << "-dynamiclib"; + D.Diag(diag::err_drv_argument_not_allowed_with) + << A->getAsString(Args) << "-dynamiclib"; Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version, "-dylib_compatibility_version"); @@ -729,6 +729,54 @@ C.addCommand(std::move(Cmd)); } +void darwin::StaticLibTool::ConstructJob(Compilation , const JobAction , + const InputInfo , + const InputInfoList , +
[PATCH] D109461: [clang][darwin] Add support for --emit-static-lib
yaxunl added inline comments. Comment at: clang/lib/Driver/ToolChains/Darwin.cpp:748 + + // ar tool command "llvm-ar ". + ArgStringList CmdArgs; libtool ? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D109461/new/ https://reviews.llvm.org/D109461 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D109461: [clang][darwin] Add support for --emit-static-lib
keith added reviewers: ashi1, tra, yaxunl. keith added a comment. Since you all were involved in adding this feature in the beginning I'd appreciate a review! Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D109461/new/ https://reviews.llvm.org/D109461 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D109461: [clang][darwin] Add support for --emit-static-lib
keith created this revision. keith requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. This uses darwin's default libtool since llvm-ar isn't normally available. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D109461 Files: clang/lib/Driver/ToolChain.cpp clang/lib/Driver/ToolChains/Darwin.cpp clang/lib/Driver/ToolChains/Darwin.h clang/test/Driver/bindings.c clang/test/Driver/darwin-static-lib.c Index: clang/test/Driver/darwin-static-lib.c === --- /dev/null +++ clang/test/Driver/darwin-static-lib.c @@ -0,0 +1,5 @@ +// 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}}" Index: clang/test/Driver/bindings.c === --- clang/test/Driver/bindings.c +++ clang/test/Driver/bindings.c @@ -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" Index: clang/lib/Driver/ToolChains/Darwin.h === --- clang/lib/Driver/ToolChains/Darwin.h +++ clang/lib/Driver/ToolChains/Darwin.h @@ -78,6 +78,20 @@ const char *LinkingOutput) const override; }; +class LLVM_LIBRARY_VISIBILITY StaticLibTool : public MachOTool { +public: + StaticLibTool(const ToolChain ) + : MachOTool("darwin::StaticLibTool", "static-lib-linker", TC) {} + + bool hasIntegratedCPP() const override { return false; } + bool isLinkJob() const override { return true; } + + void ConstructJob(Compilation , const JobAction , +const InputInfo , const InputInfoList , +const llvm::opt::ArgList , +const char *LinkingOutput) const override; +}; + class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool { public: Lipo(const ToolChain ) : MachOTool("darwin::Lipo", "lipo", TC) {} @@ -125,6 +139,7 @@ protected: Tool *buildAssembler() const override; Tool *buildLinker() const override; + Tool *buildStaticLibTool() const override; Tool *getTool(Action::ActionClass AC) const override; private: Index: clang/lib/Driver/ToolChains/Darwin.cpp === --- clang/lib/Driver/ToolChains/Darwin.cpp +++ clang/lib/Driver/ToolChains/Darwin.cpp @@ -729,6 +729,53 @@ C.addCommand(std::move(Cmd)); } +void darwin::StaticLibTool::ConstructJob( +Compilation , const JobAction , const InputInfo , +const InputInfoList , const ArgList , +const char *LinkingOutput) const { + const Driver = 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); + + // ar tool command "llvm-ar ". + 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 : 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(JA, *this, + ResponseFileSupport::AtFileUTF8(), + Exec, CmdArgs, Inputs, Output)); +}