From ae4c30a4bed9813203280d876a552cc7ab5ffbeb Mon Sep 17 00:00:00 2001 From: Petr Hosek Date: Sat, 20 Jul 2019 21:59:47 +0000 Subject: [PATCH] [ELF] Support explicitly overriding relocation model in LTO lld currently selects the relocation model automatically depending on the link flags specified, but in some cases it'd be useful to allow explicitly overriding the relocation model using a flag. llvm-svn: 366644 --- lld/Common/TargetOptionsCommandFlags.cpp | 4 ++++ lld/ELF/LTO.cpp | 4 +++- lld/include/lld/Common/TargetOptionsCommandFlags.h | 1 + lld/test/ELF/lto/relocation-model.ll | 9 +++++++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lld/Common/TargetOptionsCommandFlags.cpp b/lld/Common/TargetOptionsCommandFlags.cpp index d4c29d7..0137feb 100644 --- a/lld/Common/TargetOptionsCommandFlags.cpp +++ b/lld/Common/TargetOptionsCommandFlags.cpp @@ -26,6 +26,10 @@ llvm::TargetOptions lld::initTargetOptionsFromCodeGenFlags() { return ::InitTargetOptionsFromCodeGenFlags(); } +llvm::Optional lld::getRelocModelFromCMModel() { + return getRelocModel(); +} + llvm::Optional lld::getCodeModelFromCMModel() { return getCodeModel(); } diff --git a/lld/ELF/LTO.cpp b/lld/ELF/LTO.cpp index 28d4bfe..36880b1 100644 --- a/lld/ELF/LTO.cpp +++ b/lld/ELF/LTO.cpp @@ -76,7 +76,9 @@ static lto::Config createConfig() { c.Options.FunctionSections = true; c.Options.DataSections = true; - if (config->relocatable) + if (auto relocModel = getRelocModelFromCMModel()) + c.RelocModel = *relocModel; + else if (config->relocatable) c.RelocModel = None; else if (config->isPic) c.RelocModel = Reloc::PIC_; diff --git a/lld/include/lld/Common/TargetOptionsCommandFlags.h b/lld/include/lld/Common/TargetOptionsCommandFlags.h index 9345e61..422bb63 100644 --- a/lld/include/lld/Common/TargetOptionsCommandFlags.h +++ b/lld/include/lld/Common/TargetOptionsCommandFlags.h @@ -16,6 +16,7 @@ namespace lld { llvm::TargetOptions initTargetOptionsFromCodeGenFlags(); +llvm::Optional getRelocModelFromCMModel(); llvm::Optional getCodeModelFromCMModel(); std::string getCPUStr(); std::vector getMAttrs(); diff --git a/lld/test/ELF/lto/relocation-model.ll b/lld/test/ELF/lto/relocation-model.ll index 78334dd..825e9fe 100644 --- a/lld/test/ELF/lto/relocation-model.ll +++ b/lld/test/ELF/lto/relocation-model.ll @@ -33,6 +33,15 @@ ; RUN: llvm-readobj -r %t-out.lto.o | FileCheck %s --check-prefix=PIC +;; Explicit flag. + +; RUN: ld.lld %t.o -o %t-out -save-temps -r -mllvm -relocation-model=pic +; RUN: llvm-readobj -r %t-out.lto.o | FileCheck %s --check-prefix=PIC + +; RUN: ld.lld %t.o -o %t-out -save-temps -r -mllvm -relocation-model=static +; RUN: llvm-readobj -r %t-out.lto.o | FileCheck %s --check-prefix=STATIC + + ; PIC: R_X86_64_REX_GOTPCRELX foo ; STATIC: R_X86_64_PC32 foo -- 2.7.4