mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
Infer relocation model from module flags in relocatable LTO link.
Fix for PR33096. llvm-svn: 303578
This commit is contained in:
parent
57dfa705b6
commit
4f3c2ecbd7
@ -39,7 +39,7 @@ struct Config {
|
|||||||
std::string CPU;
|
std::string CPU;
|
||||||
TargetOptions Options;
|
TargetOptions Options;
|
||||||
std::vector<std::string> MAttrs;
|
std::vector<std::string> MAttrs;
|
||||||
Reloc::Model RelocModel = Reloc::PIC_;
|
Optional<Reloc::Model> RelocModel = Reloc::PIC_;
|
||||||
CodeModel::Model CodeModel = CodeModel::Default;
|
CodeModel::Model CodeModel = CodeModel::Default;
|
||||||
CodeGenOpt::Level CGOptLevel = CodeGenOpt::Default;
|
CodeGenOpt::Level CGOptLevel = CodeGenOpt::Default;
|
||||||
TargetMachine::CodeGenFileType CGFileType = TargetMachine::CGFT_ObjectFile;
|
TargetMachine::CodeGenFileType CGFileType = TargetMachine::CGFT_ObjectFile;
|
||||||
|
@ -114,7 +114,10 @@ static void computeCacheKey(
|
|||||||
AddUnsigned((unsigned)Conf.Options.DebuggerTuning);
|
AddUnsigned((unsigned)Conf.Options.DebuggerTuning);
|
||||||
for (auto &A : Conf.MAttrs)
|
for (auto &A : Conf.MAttrs)
|
||||||
AddString(A);
|
AddString(A);
|
||||||
AddUnsigned(Conf.RelocModel);
|
if (Conf.RelocModel)
|
||||||
|
AddUnsigned(*Conf.RelocModel);
|
||||||
|
else
|
||||||
|
AddUnsigned(-1);
|
||||||
AddUnsigned(Conf.CodeModel);
|
AddUnsigned(Conf.CodeModel);
|
||||||
AddUnsigned(Conf.CGOptLevel);
|
AddUnsigned(Conf.CGOptLevel);
|
||||||
AddUnsigned(Conf.CGFileType);
|
AddUnsigned(Conf.CGFileType);
|
||||||
|
@ -117,15 +117,22 @@ Error Config::addSaveTemps(std::string OutputFileName,
|
|||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
std::unique_ptr<TargetMachine>
|
std::unique_ptr<TargetMachine>
|
||||||
createTargetMachine(Config &Conf, StringRef TheTriple,
|
createTargetMachine(Config &Conf, const Target *TheTarget, Module &M) {
|
||||||
const Target *TheTarget) {
|
StringRef TheTriple = M.getTargetTriple();
|
||||||
SubtargetFeatures Features;
|
SubtargetFeatures Features;
|
||||||
Features.getDefaultSubtargetFeatures(Triple(TheTriple));
|
Features.getDefaultSubtargetFeatures(Triple(TheTriple));
|
||||||
for (const std::string &A : Conf.MAttrs)
|
for (const std::string &A : Conf.MAttrs)
|
||||||
Features.AddFeature(A);
|
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(
|
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));
|
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<Module> MPartInCtx = std::move(MOrErr.get());
|
||||||
|
|
||||||
std::unique_ptr<TargetMachine> TM =
|
std::unique_ptr<TargetMachine> TM =
|
||||||
createTargetMachine(C, MPartInCtx->getTargetTriple(), T);
|
createTargetMachine(C, T, *MPartInCtx);
|
||||||
|
|
||||||
codegen(C, TM.get(), AddStream, ThreadId, *MPartInCtx);
|
codegen(C, TM.get(), AddStream, ThreadId, *MPartInCtx);
|
||||||
},
|
},
|
||||||
@ -360,8 +367,7 @@ Error lto::backend(Config &C, AddStreamFn AddStream,
|
|||||||
if (!TOrErr)
|
if (!TOrErr)
|
||||||
return TOrErr.takeError();
|
return TOrErr.takeError();
|
||||||
|
|
||||||
std::unique_ptr<TargetMachine> TM =
|
std::unique_ptr<TargetMachine> TM = createTargetMachine(C, *TOrErr, *Mod);
|
||||||
createTargetMachine(C, Mod->getTargetTriple(), *TOrErr);
|
|
||||||
|
|
||||||
// Setup optimization remarks.
|
// Setup optimization remarks.
|
||||||
auto DiagFileOrErr = lto::setupOptimizationRemarks(
|
auto DiagFileOrErr = lto::setupOptimizationRemarks(
|
||||||
@ -397,8 +403,7 @@ Error lto::thinBackend(Config &Conf, unsigned Task, AddStreamFn AddStream,
|
|||||||
if (!TOrErr)
|
if (!TOrErr)
|
||||||
return TOrErr.takeError();
|
return TOrErr.takeError();
|
||||||
|
|
||||||
std::unique_ptr<TargetMachine> TM =
|
std::unique_ptr<TargetMachine> TM = createTargetMachine(Conf, *TOrErr, Mod);
|
||||||
createTargetMachine(Conf, Mod.getTargetTriple(), *TOrErr);
|
|
||||||
|
|
||||||
if (Conf.CodeGenOnly) {
|
if (Conf.CodeGenOnly) {
|
||||||
codegen(Conf, TM.get(), AddStream, Task, Mod);
|
codegen(Conf, TM.get(), AddStream, Task, Mod);
|
||||||
|
63
test/tools/gold/X86/relocation-model-pic.ll
Normal file
63
test/tools/gold/X86/relocation-model-pic.ll
Normal 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
|
||||||
|
}
|
@ -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_set_extra_library_path set_extra_library_path = nullptr;
|
||||||
static ld_plugin_get_view get_view = nullptr;
|
static ld_plugin_get_view get_view = nullptr;
|
||||||
static bool IsExecutable = false;
|
static bool IsExecutable = false;
|
||||||
static Optional<Reloc::Model> RelocationModel;
|
static Optional<Reloc::Model> RelocationModel = None;
|
||||||
static std::string output_name = "";
|
static std::string output_name = "";
|
||||||
static std::list<claimed_file> Modules;
|
static std::list<claimed_file> Modules;
|
||||||
static DenseMap<int, void *> FDToLeaderHandle;
|
static DenseMap<int, void *> FDToLeaderHandle;
|
||||||
@ -282,6 +282,8 @@ ld_plugin_status onload(ld_plugin_tv *tv) {
|
|||||||
case LDPT_LINKER_OUTPUT:
|
case LDPT_LINKER_OUTPUT:
|
||||||
switch (tv->tv_u.tv_val) {
|
switch (tv->tv_u.tv_val) {
|
||||||
case LDPO_REL: // .o
|
case LDPO_REL: // .o
|
||||||
|
IsExecutable = false;
|
||||||
|
break;
|
||||||
case LDPO_DYN: // .so
|
case LDPO_DYN: // .so
|
||||||
IsExecutable = false;
|
IsExecutable = false;
|
||||||
RelocationModel = Reloc::PIC_;
|
RelocationModel = Reloc::PIC_;
|
||||||
@ -726,7 +728,7 @@ static std::unique_ptr<LTO> createLTO() {
|
|||||||
Conf.Options.RelaxELFRelocations = false;
|
Conf.Options.RelaxELFRelocations = false;
|
||||||
|
|
||||||
Conf.MAttrs = MAttrs;
|
Conf.MAttrs = MAttrs;
|
||||||
Conf.RelocModel = *RelocationModel;
|
Conf.RelocModel = RelocationModel;
|
||||||
Conf.CGOptLevel = getCGOptLevel();
|
Conf.CGOptLevel = getCGOptLevel();
|
||||||
Conf.DisableVerify = options::DisableVerify;
|
Conf.DisableVerify = options::DisableVerify;
|
||||||
Conf.OptLevel = options::OptLevel;
|
Conf.OptLevel = options::OptLevel;
|
||||||
|
Loading…
Reference in New Issue
Block a user