diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/CodeGen/BackendUtil.cpp | 1 | ||||
-rw-r--r-- | clang/tools/driver/cc1as_main.cpp | 19 |
2 files changed, 18 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index 55d1a9e13b0..998a07c787a 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -463,6 +463,7 @@ TargetMachine *EmitAssemblyHelper::CreateTargetMachine(bool MustCreateTM) { FeaturesStr = Features.getString(); } + // Keep this synced with the equivalent code in tools/driver/cc1as_main.cpp. llvm::Reloc::Model RM = llvm::Reloc::Default; if (CodeGenOpts.RelocationModel == "static") { RM = llvm::Reloc::Static; diff --git a/clang/tools/driver/cc1as_main.cpp b/clang/tools/driver/cc1as_main.cpp index fd0fbb4c5a2..4259f2985fb 100644 --- a/clang/tools/driver/cc1as_main.cpp +++ b/clang/tools/driver/cc1as_main.cpp @@ -126,6 +126,9 @@ struct AssemblerInvocation { unsigned NoExecStack : 1; unsigned FatalWarnings : 1; + /// The name of the relocation model to use. + std::string RelocationModel; + /// @} public: @@ -248,6 +251,7 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, Opts.RelaxAll = Args.hasArg(OPT_mrelax_all); Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack); Opts.FatalWarnings = Args.hasArg(OPT_massembler_fatal_warnings); + Opts.RelocationModel = Args.getLastArgValue(OPT_mrelocation_model, "pic"); return Success; } @@ -321,8 +325,19 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts, std::unique_ptr<MCObjectFileInfo> MOFI(new MCObjectFileInfo()); MCContext Ctx(MAI.get(), MRI.get(), MOFI.get(), &SrcMgr); - // FIXME: Assembler behavior can change with -static. - MOFI->InitMCObjectFileInfo(Triple(Opts.Triple), Reloc::Default, + + llvm::Reloc::Model RM = llvm::Reloc::Default; + if (Opts.RelocationModel == "static") { + RM = llvm::Reloc::Static; + } else if (Opts.RelocationModel == "pic") { + RM = llvm::Reloc::PIC_; + } else { + assert(Opts.RelocationModel == "dynamic-no-pic" && + "Invalid PIC model!"); + RM = llvm::Reloc::DynamicNoPIC; + } + + MOFI->InitMCObjectFileInfo(Triple(Opts.Triple), RM, CodeModel::Default, Ctx); if (Opts.SaveTemporaryLabels) Ctx.setAllowTemporaryLabels(false); |