mirror of https://github.com/microsoft/clang.git
[Driver][Darwin] Pass -no_deduplicate to ld64
Recent versions of ld64 run a deduplicate pass, which is on by default. Disable the pass by using -no_deduplicate in certain condition and enhance total compile time. rdar://problem/25455336 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@284798 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3d57694adc
commit
647ac26200
|
@ -175,6 +175,7 @@ public:
|
|||
|
||||
const list_type &getJobs() const { return Jobs; }
|
||||
|
||||
bool empty() const { return Jobs.empty(); }
|
||||
size_type size() const { return Jobs.size(); }
|
||||
iterator begin() { return Jobs.begin(); }
|
||||
const_iterator begin() const { return Jobs.begin(); }
|
||||
|
|
|
@ -7882,6 +7882,29 @@ bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
|
|||
return false;
|
||||
}
|
||||
|
||||
/// \brief Pass -no_deduplicate to ld64 under certain conditions:
|
||||
///
|
||||
/// - Either -O0 or -O1 is explicitly specified
|
||||
/// - No -O option is specified *and* this is a compile+link (implicit -O0)
|
||||
///
|
||||
/// Also do *not* add -no_deduplicate when no -O option is specified and this
|
||||
/// is just a link (we can't imply -O0)
|
||||
static bool shouldLinkerNotDedup(bool IsLinkerOnlyAction, const ArgList &Args) {
|
||||
if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
|
||||
if (A->getOption().matches(options::OPT_O0))
|
||||
return true;
|
||||
if (A->getOption().matches(options::OPT_O))
|
||||
return llvm::StringSwitch<bool>(A->getValue())
|
||||
.Case("1", true)
|
||||
.Default(false);
|
||||
return false; // OPT_Ofast & OPT_O4
|
||||
}
|
||||
|
||||
if (!IsLinkerOnlyAction) // Implicit -O0 for compile+linker only.
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
|
||||
ArgStringList &CmdArgs,
|
||||
const InputInfoList &Inputs) const {
|
||||
|
@ -7938,6 +7961,10 @@ void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
|
|||
}
|
||||
}
|
||||
|
||||
// ld64 version 262 and above run the deduplicate pass by default.
|
||||
if (Version[0] >= 262 && shouldLinkerNotDedup(C.getJobs().empty(), Args))
|
||||
CmdArgs.push_back("-no_deduplicate");
|
||||
|
||||
// Derived from the "link" spec.
|
||||
Args.AddAllArgs(CmdArgs, options::OPT_static);
|
||||
if (!Args.hasArg(options::OPT_static))
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
// REQUIRES: system-darwin
|
||||
|
||||
// -no_deduplicate is only present from ld64 version 262 and later.
|
||||
// RUN: %clang -target x86_64-apple-darwin10 -### %s \
|
||||
// RUN: -mlinker-version=261 -O0 2>&1 | FileCheck -check-prefix=LINK_DEDUP %s
|
||||
|
||||
// Add -no_deduplicate when either -O0 or -O1 is explicitly specified
|
||||
// RUN: %clang -target x86_64-apple-darwin10 -### %s \
|
||||
// RUN: -mlinker-version=262 -O0 2>&1 | FileCheck -check-prefix=LINK_NODEDUP %s
|
||||
// RUN: %clang -target x86_64-apple-darwin10 -### %s \
|
||||
// RUN: -mlinker-version=262 -O1 2>&1 | FileCheck -check-prefix=LINK_NODEDUP %s
|
||||
|
||||
// RUN: %clang -target x86_64-apple-darwin10 -### %s \
|
||||
// RUN: -mlinker-version=262 -O2 2>&1 | FileCheck -check-prefix=LINK_DEDUP %s
|
||||
// RUN: %clang -target x86_64-apple-darwin10 -### %s \
|
||||
// RUN: -mlinker-version=262 -O3 2>&1 | FileCheck -check-prefix=LINK_DEDUP %s
|
||||
// RUN: %clang -target x86_64-apple-darwin10 -### %s \
|
||||
// RUN: -mlinker-version=262 -Os 2>&1 | FileCheck -check-prefix=LINK_DEDUP %s
|
||||
// RUN: %clang -target x86_64-apple-darwin10 -### %s \
|
||||
// RUN: -mlinker-version=262 -O4 2>&1 | FileCheck -check-prefix=LINK_DEDUP %s
|
||||
// RUN: %clang -target x86_64-apple-darwin10 -### %s \
|
||||
// RUN: -mlinker-version=262 -Ofast 2>&1 | FileCheck -check-prefix=LINK_DEDUP %s
|
||||
|
||||
// Add -no_deduplicate when no -O option is specified *and* this is a compile+link
|
||||
// (implicit -O0)
|
||||
// RUN: %clang -target x86_64-apple-darwin10 -### %s \
|
||||
// RUN: -mlinker-version=262 2>&1 | FileCheck -check-prefix=LINK_NODEDUP %s
|
||||
|
||||
// Do *not* add -no_deduplicate when no -O option is specified and this is just a link
|
||||
// (since we can't imply -O0)
|
||||
// RUN: rm -f %t.o %t.bin
|
||||
// RUN: %clang -target x86_64-apple-darwin10 -c -o %t.o %s
|
||||
// RUN: %clang -target x86_64-apple-darwin10 %t.o -### -mlinker-version=262 \
|
||||
// RUN: -o %t.bin 2>&1 | FileCheck -check-prefix=LINK_DEDUP %s
|
||||
// RUN: %clang -target x86_64-apple-darwin10 %t.o -### -mlinker-version=262 \
|
||||
// RUN: -O0 -o %t.bin 2>&1 | FileCheck -check-prefix=LINK_NODEDUP %s
|
||||
// RUN: %clang -target x86_64-apple-darwin10 %t.o -### -mlinker-version=262 \
|
||||
// RUN: -O1 -o %t.bin 2>&1 | FileCheck -check-prefix=LINK_NODEDUP %s
|
||||
// RUN: %clang -target x86_64-apple-darwin10 %t.o -### -mlinker-version=262 \
|
||||
// RUN: -O2 -o %t.bin 2>&1 | FileCheck -check-prefix=LINK_DEDUP %s
|
||||
|
||||
// LINK_NODEDUP: {{ld(.exe)?"}}
|
||||
// LINK_NODEDUP: "-no_deduplicate"
|
||||
|
||||
// LINK_DEDUP: {{ld(.exe)?"}}
|
||||
// LINK_DEDUP-NOT: "-no_deduplicate"
|
Loading…
Reference in New Issue