]> granicus.if.org Git - clang/commitdiff
Pass the relocation model to LLVM for assembler files.
authorJoerg Sonnenberger <joerg@bec.de>
Fri, 18 Sep 2015 11:13:43 +0000 (11:13 +0000)
committerJoerg Sonnenberger <joerg@bec.de>
Fri, 18 Sep 2015 11:13:43 +0000 (11:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@247981 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/BackendUtil.cpp
tools/driver/cc1as_main.cpp

index 55d1a9e13b07a606fb9c11b53bae2358f1cd5cf4..998a07c787aadb68719e491b5cd435692ec05172 100644 (file)
@@ -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;
index fd0fbb4c5a26b0023ff249d55b1cf14d2196f1b4..4259f2985fbe8a7ec312a94cd53cc94d884b4f8c 100644 (file)
@@ -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);