[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.

git-svn-id: https://llvm.org/svn/llvm-project/lld/trunk@366644 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Common/TargetOptionsCommandFlags.cpp b/Common/TargetOptionsCommandFlags.cpp
index d4c29d7..0137feb 100644
--- a/Common/TargetOptionsCommandFlags.cpp
+++ b/Common/TargetOptionsCommandFlags.cpp
@@ -26,6 +26,10 @@
   return ::InitTargetOptionsFromCodeGenFlags();
 }
 
+llvm::Optional<llvm::Reloc::Model> lld::getRelocModelFromCMModel() {
+  return getRelocModel();
+}
+
 llvm::Optional<llvm::CodeModel::Model> lld::getCodeModelFromCMModel() {
   return getCodeModel();
 }
diff --git a/ELF/LTO.cpp b/ELF/LTO.cpp
index 28d4bfe..36880b1 100644
--- a/ELF/LTO.cpp
+++ b/ELF/LTO.cpp
@@ -76,7 +76,9 @@
   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/include/lld/Common/TargetOptionsCommandFlags.h b/include/lld/Common/TargetOptionsCommandFlags.h
index 9345e61..422bb63 100644
--- a/include/lld/Common/TargetOptionsCommandFlags.h
+++ b/include/lld/Common/TargetOptionsCommandFlags.h
@@ -16,6 +16,7 @@
 
 namespace lld {
 llvm::TargetOptions initTargetOptionsFromCodeGenFlags();
+llvm::Optional<llvm::Reloc::Model> getRelocModelFromCMModel();
 llvm::Optional<llvm::CodeModel::Model> getCodeModelFromCMModel();
 std::string getCPUStr();
 std::vector<std::string> getMAttrs();
diff --git a/test/ELF/lto/relocation-model.ll b/test/ELF/lto/relocation-model.ll
index 78334dd..825e9fe 100644
--- a/test/ELF/lto/relocation-model.ll
+++ b/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