[Driver] Make the use of relax relocations a per target option

The support for relax relocations is dependent on the linker and
different toolchains within the same compiler can be using different
linkers some of which may or may not support relax relocations.

Give toolchains the option to control whether they want to use relax
relocations in addition to the existing (global) build system option.

Differential Revision: https://reviews.llvm.org/D39831

llvm-svn: 318816
This commit is contained in:
Petr Hosek 2017-11-22 01:38:31 +00:00
parent 0a340ab31c
commit 5668d83e0e
6 changed files with 10 additions and 8 deletions

View File

@ -18,13 +18,6 @@ if(NOT APPLE)
set(CLANG_DEFAULT_LINKER lld CACHE STRING "") set(CLANG_DEFAULT_LINKER lld CACHE STRING "")
endif() endif()
# This is a "Does your linker support it?" option that only applies
# to x86-64 ELF targets. All Fuchsia target linkers do support it.
# For x86-64 Linux, it's supported by LLD and by GNU linkers since
# binutils 2.27, so one can hope that all Linux hosts in use handle it.
# Ideally this would be settable as a per-target option.
set(ENABLE_X86_RELAX_RELOCATIONS ON CACHE BOOL "")
if(APPLE) if(APPLE)
set(LLDB_CODESIGN_IDENTITY "" CACHE STRING "") set(LLDB_CODESIGN_IDENTITY "" CACHE STRING "")
endif() endif()

View File

@ -316,6 +316,9 @@ public:
/// mixed dispatch method be used? /// mixed dispatch method be used?
virtual bool UseObjCMixedDispatch() const { return false; } virtual bool UseObjCMixedDispatch() const { return false; }
/// \brief Check whether to enable x86 relax relocations by default.
virtual bool useRelaxRelocations() const;
/// GetDefaultStackProtectorLevel - Get the default stack protector level for /// GetDefaultStackProtectorLevel - Get the default stack protector level for
/// this tool chain (0=off, 1=on, 2=strong, 3=all). /// this tool chain (0=off, 1=on, 2=strong, 3=all).
virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const { virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const {

View File

@ -90,6 +90,10 @@ bool ToolChain::useIntegratedAs() const {
IsIntegratedAssemblerDefault()); IsIntegratedAssemblerDefault());
} }
bool ToolChain::useRelaxRelocations() const {
return ENABLE_X86_RELAX_RELOCATIONS;
}
const SanitizerArgs& ToolChain::getSanitizerArgs() const { const SanitizerArgs& ToolChain::getSanitizerArgs() const {
if (!SanitizerArguments.get()) if (!SanitizerArguments.get())
SanitizerArguments.reset(new SanitizerArgs(*this, Args)); SanitizerArguments.reset(new SanitizerArgs(*this, Args));

View File

@ -1869,7 +1869,7 @@ static void CollectArgsForIntegratedAssembler(Compilation &C,
// arg after parsing the '-I' arg. // arg after parsing the '-I' arg.
bool TakeNextArg = false; bool TakeNextArg = false;
bool UseRelaxRelocations = ENABLE_X86_RELAX_RELOCATIONS; bool UseRelaxRelocations = C.getDefaultToolChain().useRelaxRelocations();
const char *MipsTargetFeature = nullptr; const char *MipsTargetFeature = nullptr;
for (const Arg *A : for (const Arg *A :
Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) { Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {

View File

@ -43,6 +43,7 @@ public:
bool HasNativeLLVMSupport() const override { return true; } bool HasNativeLLVMSupport() const override { return true; }
bool IsIntegratedAssemblerDefault() const override { return true; } bool IsIntegratedAssemblerDefault() const override { return true; }
bool IsMathErrnoDefault() const override { return false; } bool IsMathErrnoDefault() const override { return false; }
bool useRelaxRelocations() const override { return true; };
RuntimeLibType GetDefaultRuntimeLibType() const override { RuntimeLibType GetDefaultRuntimeLibType() const override {
return ToolChain::RLT_CompilerRT; return ToolChain::RLT_CompilerRT;
} }

View File

@ -5,6 +5,7 @@
// RUN: --sysroot=%S/platform 2>&1 \ // RUN: --sysroot=%S/platform 2>&1 \
// RUN: | FileCheck -check-prefixes=CHECK,CHECK-AARCH64 %s // RUN: | FileCheck -check-prefixes=CHECK,CHECK-AARCH64 %s
// CHECK: {{.*}}clang{{.*}}" "-cc1" // CHECK: {{.*}}clang{{.*}}" "-cc1"
// CHECK: "--mrelax-relocations"
// CHECK: "-munwind-tables" // CHECK: "-munwind-tables"
// CHECK: "-fuse-init-array" // CHECK: "-fuse-init-array"
// CHECK: "-isysroot" "[[SYSROOT:[^"]+]]" // CHECK: "-isysroot" "[[SYSROOT:[^"]+]]"