mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-27 23:51:56 +00:00
[clang][darwin] Add support for --emit-static-lib
This uses darwin's default libtool since llvm-ar isn't normally available. Differential Revision: https://reviews.llvm.org/D109461
This commit is contained in:
parent
121aab84d1
commit
80d62993d0
@ -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");
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
@ -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);
|
||||
}
|
||||
|
@ -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) {}
|
||||
@ -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:
|
||||
|
@ -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"
|
||||
|
5
clang/test/Driver/darwin-static-lib.c
Normal file
5
clang/test/Driver/darwin-static-lib.c
Normal file
@ -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}}"
|
Loading…
Reference in New Issue
Block a user