From 33284b73bd385c22898301b8937c73d87bcfcc11 Mon Sep 17 00:00:00 2001 From: Petr Hosek Date: Wed, 22 Nov 2017 01:38:31 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@318816 91177308-0d34-0410-b5e6-96231b3b80d8 --- cmake/caches/Fuchsia-stage2.cmake | 7 ------- include/clang/Driver/ToolChain.h | 3 +++ lib/Driver/ToolChain.cpp | 4 ++++ lib/Driver/ToolChains/Clang.cpp | 2 +- lib/Driver/ToolChains/Fuchsia.h | 1 + test/Driver/fuchsia.c | 1 + 6 files changed, 10 insertions(+), 8 deletions(-) diff --git a/cmake/caches/Fuchsia-stage2.cmake b/cmake/caches/Fuchsia-stage2.cmake index d2f19fd6d0..b5841e257f 100644 --- a/cmake/caches/Fuchsia-stage2.cmake +++ b/cmake/caches/Fuchsia-stage2.cmake @@ -18,13 +18,6 @@ if(NOT APPLE) set(CLANG_DEFAULT_LINKER lld CACHE STRING "") 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) set(LLDB_CODESIGN_IDENTITY "" CACHE STRING "") endif() diff --git a/include/clang/Driver/ToolChain.h b/include/clang/Driver/ToolChain.h index 1206794e93..bd71038798 100644 --- a/include/clang/Driver/ToolChain.h +++ b/include/clang/Driver/ToolChain.h @@ -316,6 +316,9 @@ public: /// mixed dispatch method be used? 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 /// this tool chain (0=off, 1=on, 2=strong, 3=all). virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const { diff --git a/lib/Driver/ToolChain.cpp b/lib/Driver/ToolChain.cpp index fac0a5bbff..741f4284cb 100644 --- a/lib/Driver/ToolChain.cpp +++ b/lib/Driver/ToolChain.cpp @@ -90,6 +90,10 @@ bool ToolChain::useIntegratedAs() const { IsIntegratedAssemblerDefault()); } +bool ToolChain::useRelaxRelocations() const { + return ENABLE_X86_RELAX_RELOCATIONS; +} + const SanitizerArgs& ToolChain::getSanitizerArgs() const { if (!SanitizerArguments.get()) SanitizerArguments.reset(new SanitizerArgs(*this, Args)); diff --git a/lib/Driver/ToolChains/Clang.cpp b/lib/Driver/ToolChains/Clang.cpp index 3ab28d471b..d96664cf0b 100644 --- a/lib/Driver/ToolChains/Clang.cpp +++ b/lib/Driver/ToolChains/Clang.cpp @@ -1869,7 +1869,7 @@ static void CollectArgsForIntegratedAssembler(Compilation &C, // arg after parsing the '-I' arg. bool TakeNextArg = false; - bool UseRelaxRelocations = ENABLE_X86_RELAX_RELOCATIONS; + bool UseRelaxRelocations = C.getDefaultToolChain().useRelaxRelocations(); const char *MipsTargetFeature = nullptr; for (const Arg *A : Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) { diff --git a/lib/Driver/ToolChains/Fuchsia.h b/lib/Driver/ToolChains/Fuchsia.h index 6d825fb817..6f438deca7 100644 --- a/lib/Driver/ToolChains/Fuchsia.h +++ b/lib/Driver/ToolChains/Fuchsia.h @@ -43,6 +43,7 @@ public: bool HasNativeLLVMSupport() const override { return true; } bool IsIntegratedAssemblerDefault() const override { return true; } bool IsMathErrnoDefault() const override { return false; } + bool useRelaxRelocations() const override { return true; }; RuntimeLibType GetDefaultRuntimeLibType() const override { return ToolChain::RLT_CompilerRT; } diff --git a/test/Driver/fuchsia.c b/test/Driver/fuchsia.c index 3f5597c36e..eb413b7509 100644 --- a/test/Driver/fuchsia.c +++ b/test/Driver/fuchsia.c @@ -5,6 +5,7 @@ // RUN: --sysroot=%S/platform 2>&1 \ // RUN: | FileCheck -check-prefixes=CHECK,CHECK-AARCH64 %s // CHECK: {{.*}}clang{{.*}}" "-cc1" +// CHECK: "--mrelax-relocations" // CHECK: "-munwind-tables" // CHECK: "-fuse-init-array" // CHECK: "-isysroot" "[[SYSROOT:[^"]+]]" -- 2.40.0