1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-26 04:32:44 +01:00

Infer relocation model from module flags in relocatable LTO link.

Fix for PR33096.

llvm-svn: 303578
This commit is contained in:
Evgeniy Stepanov 2017-05-22 21:11:35 +00:00
parent 57dfa705b6
commit 4f3c2ecbd7
5 changed files with 85 additions and 12 deletions

View File

@ -39,7 +39,7 @@ struct Config {
std::string CPU;
TargetOptions Options;
std::vector<std::string> MAttrs;
Reloc::Model RelocModel = Reloc::PIC_;
Optional<Reloc::Model> RelocModel = Reloc::PIC_;
CodeModel::Model CodeModel = CodeModel::Default;
CodeGenOpt::Level CGOptLevel = CodeGenOpt::Default;
TargetMachine::CodeGenFileType CGFileType = TargetMachine::CGFT_ObjectFile;

View File

@ -114,7 +114,10 @@ static void computeCacheKey(
AddUnsigned((unsigned)Conf.Options.DebuggerTuning);
for (auto &A : Conf.MAttrs)
AddString(A);
AddUnsigned(Conf.RelocModel);
if (Conf.RelocModel)
AddUnsigned(*Conf.RelocModel);
else
AddUnsigned(-1);
AddUnsigned(Conf.CodeModel);
AddUnsigned(Conf.CGOptLevel);
AddUnsigned(Conf.CGFileType);

View File

@ -117,15 +117,22 @@ Error Config::addSaveTemps(std::string OutputFileName,
namespace {
std::unique_ptr<TargetMachine>
createTargetMachine(Config &Conf, StringRef TheTriple,
const Target *TheTarget) {
createTargetMachine(Config &Conf, const Target *TheTarget, Module &M) {
StringRef TheTriple = M.getTargetTriple();
SubtargetFeatures Features;
Features.getDefaultSubtargetFeatures(Triple(TheTriple));
for (const std::string &A : Conf.MAttrs)
Features.AddFeature(A);
Reloc::Model RelocModel;
if (Conf.RelocModel)
RelocModel = *Conf.RelocModel;
else
RelocModel =
M.getPICLevel() == PICLevel::NotPIC ? Reloc::Static : Reloc::PIC_;
return std::unique_ptr<TargetMachine>(TheTarget->createTargetMachine(
TheTriple, Conf.CPU, Features.getString(), Conf.Options, Conf.RelocModel,
TheTriple, Conf.CPU, Features.getString(), Conf.Options, RelocModel,
Conf.CodeModel, Conf.CGOptLevel));
}
@ -311,7 +318,7 @@ void splitCodeGen(Config &C, TargetMachine *TM, AddStreamFn AddStream,
std::unique_ptr<Module> MPartInCtx = std::move(MOrErr.get());
std::unique_ptr<TargetMachine> TM =
createTargetMachine(C, MPartInCtx->getTargetTriple(), T);
createTargetMachine(C, T, *MPartInCtx);
codegen(C, TM.get(), AddStream, ThreadId, *MPartInCtx);
},
@ -360,8 +367,7 @@ Error lto::backend(Config &C, AddStreamFn AddStream,
if (!TOrErr)
return TOrErr.takeError();
std::unique_ptr<TargetMachine> TM =
createTargetMachine(C, Mod->getTargetTriple(), *TOrErr);
std::unique_ptr<TargetMachine> TM = createTargetMachine(C, *TOrErr, *Mod);
// Setup optimization remarks.
auto DiagFileOrErr = lto::setupOptimizationRemarks(
@ -397,8 +403,7 @@ Error lto::thinBackend(Config &Conf, unsigned Task, AddStreamFn AddStream,
if (!TOrErr)
return TOrErr.takeError();
std::unique_ptr<TargetMachine> TM =
createTargetMachine(Conf, Mod.getTargetTriple(), *TOrErr);
std::unique_ptr<TargetMachine> TM = createTargetMachine(Conf, *TOrErr, Mod);
if (Conf.CodeGenOnly) {
codegen(Conf, TM.get(), AddStream, Task, Mod);

View File

@ -0,0 +1,63 @@
; RUN: cat %s >%t.pic.ll
; RUN: echo '!llvm.module.flags = !{!0}' >>%t.pic.ll
; RUN: echo '!0 = !{i32 1, !"PIC Level", i32 2}' >>%t.pic.ll
; RUN: llvm-as %s -o %t.o
; RUN: llvm-as %t.pic.ll -o %t.pic.o
;; Non-PIC source.
; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold.so \
; RUN: --shared \
; RUN: --plugin-opt=save-temps %t.o -o %t-out
; RUN: llvm-readobj -r %t-out.o | FileCheck %s --check-prefix=PIC
; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold.so \
; RUN: --export-dynamic --noinhibit-exec -pie \
; RUN: --plugin-opt=save-temps %t.o -o %t-out
; RUN: llvm-readobj -r %t-out.o | FileCheck %s --check-prefix=PIC
; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold.so \
; RUN: --export-dynamic --noinhibit-exec \
; RUN: --plugin-opt=save-temps %t.o -o %t-out
; RUN: llvm-readobj -r %t-out.o | FileCheck %s --check-prefix=STATIC
; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold.so \
; RUN: -r \
; RUN: --plugin-opt=save-temps %t.o -o %t-out
; RUN: llvm-readobj -r %t-out.o | FileCheck %s --check-prefix=STATIC
;; PIC source.
; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold.so \
; RUN: --shared \
; RUN: --plugin-opt=save-temps %t.pic.o -o %t-out
; RUN: llvm-readobj -r %t-out.o | FileCheck %s --check-prefix=PIC
; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold.so \
; RUN: --export-dynamic --noinhibit-exec -pie \
; RUN: --plugin-opt=save-temps %t.pic.o -o %t-out
; RUN: llvm-readobj -r %t-out.o | FileCheck %s --check-prefix=PIC
; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold.so \
; RUN: --export-dynamic --noinhibit-exec \
; RUN: --plugin-opt=save-temps %t.pic.o -o %t-out
; RUN: llvm-readobj -r %t-out.o | FileCheck %s --check-prefix=STATIC
; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold.so \
; RUN: -r \
; RUN: --plugin-opt=save-temps %t.pic.o -o %t-out
; RUN: llvm-readobj -r %t-out.o | FileCheck %s --check-prefix=PIC
; PIC: R_X86_64_GOTPCREL foo
; STATIC: R_X86_64_PC32 foo
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@foo = external global i32
define i32 @main() {
%t = load i32, i32* @foo
ret i32 %t
}

View File

@ -102,7 +102,7 @@ static ld_plugin_add_input_file add_input_file = nullptr;
static ld_plugin_set_extra_library_path set_extra_library_path = nullptr;
static ld_plugin_get_view get_view = nullptr;
static bool IsExecutable = false;
static Optional<Reloc::Model> RelocationModel;
static Optional<Reloc::Model> RelocationModel = None;
static std::string output_name = "";
static std::list<claimed_file> Modules;
static DenseMap<int, void *> FDToLeaderHandle;
@ -282,6 +282,8 @@ ld_plugin_status onload(ld_plugin_tv *tv) {
case LDPT_LINKER_OUTPUT:
switch (tv->tv_u.tv_val) {
case LDPO_REL: // .o
IsExecutable = false;
break;
case LDPO_DYN: // .so
IsExecutable = false;
RelocationModel = Reloc::PIC_;
@ -726,7 +728,7 @@ static std::unique_ptr<LTO> createLTO() {
Conf.Options.RelaxELFRelocations = false;
Conf.MAttrs = MAttrs;
Conf.RelocModel = *RelocationModel;
Conf.RelocModel = RelocationModel;
Conf.CGOptLevel = getCGOptLevel();
Conf.DisableVerify = options::DisableVerify;
Conf.OptLevel = options::OptLevel;