59 lines
2.3 KiB
Diff
59 lines
2.3 KiB
Diff
From 3cf50196b429a6912452ad6e43218b5f6b7922cf Mon Sep 17 00:00:00 2001
|
|
From: Samuel Holland <samuel@sholland.org>
|
|
Date: Sun, 3 Nov 2019 10:52:00 -0600
|
|
Subject: [PATCH 18/18] Configure LLVM module PIC level
|
|
|
|
As of LLVM 9, this is required for 32-bit PowerPC to properly generate
|
|
PLT references. Previously, only BigPIC was supported; now LLVM supports
|
|
both BigPIC and SmallPIC, and there is no default value provided.
|
|
---
|
|
src/librustc_codegen_llvm/context.rs | 4 ++++
|
|
src/librustc_codegen_llvm/llvm/ffi.rs | 1 +
|
|
src/rustllvm/PassWrapper.cpp | 4 ++++
|
|
3 files changed, 9 insertions(+)
|
|
|
|
diff --git a/src/librustc_codegen_llvm/context.rs b/src/librustc_codegen_llvm/context.rs
|
|
index 2da93877..4a40349c 100644
|
|
--- a/src/librustc_codegen_llvm/context.rs
|
|
+++ b/src/librustc_codegen_llvm/context.rs
|
|
@@ -203,6 +203,10 @@ pub unsafe fn create_module(
|
|
let llvm_target = SmallCStr::new(&sess.target.target.llvm_target);
|
|
llvm::LLVMRustSetNormalizedTarget(llmod, llvm_target.as_ptr());
|
|
|
|
+ if get_reloc_model(sess) == llvm::RelocMode::PIC {
|
|
+ llvm::LLVMRustSetModulePICLevel(llmod);
|
|
+ }
|
|
+
|
|
if is_pie_binary(sess) {
|
|
llvm::LLVMRustSetModulePIELevel(llmod);
|
|
}
|
|
diff --git a/src/librustc_codegen_llvm/llvm/ffi.rs b/src/librustc_codegen_llvm/llvm/ffi.rs
|
|
index c69942ef..7f7b5b22 100644
|
|
--- a/src/librustc_codegen_llvm/llvm/ffi.rs
|
|
+++ b/src/librustc_codegen_llvm/llvm/ffi.rs
|
|
@@ -1805,6 +1805,7 @@ extern "C" {
|
|
|
|
pub fn LLVMRustSetComdat(M: &'a Module, V: &'a Value, Name: *const c_char);
|
|
pub fn LLVMRustUnsetComdat(V: &Value);
|
|
+ pub fn LLVMRustSetModulePICLevel(M: &Module);
|
|
pub fn LLVMRustSetModulePIELevel(M: &Module);
|
|
pub fn LLVMRustModuleBufferCreate(M: &Module) -> &'static mut ModuleBuffer;
|
|
pub fn LLVMRustModuleBufferPtr(p: &ModuleBuffer) -> *const u8;
|
|
diff --git a/src/rustllvm/PassWrapper.cpp b/src/rustllvm/PassWrapper.cpp
|
|
index 0cda3465..4c5bc20b 100644
|
|
--- a/src/rustllvm/PassWrapper.cpp
|
|
+++ b/src/rustllvm/PassWrapper.cpp
|
|
@@ -754,6 +754,10 @@ LLVMRustSetDataLayoutFromTargetMachine(LLVMModuleRef Module,
|
|
unwrap(Module)->setDataLayout(Target->createDataLayout());
|
|
}
|
|
|
|
+extern "C" void LLVMRustSetModulePICLevel(LLVMModuleRef M) {
|
|
+ unwrap(M)->setPICLevel(PICLevel::Level::BigPIC);
|
|
+}
|
|
+
|
|
extern "C" void LLVMRustSetModulePIELevel(LLVMModuleRef M) {
|
|
unwrap(M)->setPIELevel(PIELevel::Level::Large);
|
|
}
|
|
--
|
|
2.24.0
|
|
|