Skip to content

Commit d1a6d47

Browse files
Make LLVM symbol visibility FFI types more stable.
1 parent 692d7cf commit d1a6d47

File tree

3 files changed

+54
-9
lines changed

3 files changed

+54
-9
lines changed

src/librustc_llvm/ffi.rs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,15 @@ pub enum Linkage {
6464
CommonLinkage = 10,
6565
}
6666

67+
// LLVMRustVisibility
68+
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
69+
#[repr(C)]
70+
pub enum Visibility {
71+
Default = 0,
72+
Hidden = 1,
73+
Protected = 2,
74+
}
75+
6776
/// LLVMDiagnosticSeverity
6877
#[derive(Copy, Clone, Debug)]
6978
#[repr(C)]
@@ -399,13 +408,6 @@ pub type OperandBundleDefRef = *mut OperandBundleDef_opaque;
399408
pub type DiagnosticHandler = unsafe extern "C" fn(DiagnosticInfoRef, *mut c_void);
400409
pub type InlineAsmDiagHandler = unsafe extern "C" fn(SMDiagnosticRef, *const c_void, c_uint);
401410

402-
/// LLVMVisibility
403-
#[repr(C)]
404-
pub enum Visibility {
405-
Default,
406-
Hidden,
407-
Protected,
408-
}
409411

410412
pub mod debuginfo {
411413
use super::MetadataRef;
@@ -655,7 +657,8 @@ extern "C" {
655657
pub fn LLVMRustSetLinkage(Global: ValueRef, RustLinkage: Linkage);
656658
pub fn LLVMGetSection(Global: ValueRef) -> *const c_char;
657659
pub fn LLVMSetSection(Global: ValueRef, Section: *const c_char);
658-
pub fn LLVMSetVisibility(Global: ValueRef, Viz: Visibility);
660+
pub fn LLVMRustGetVisibility(Global: ValueRef) -> Visibility;
661+
pub fn LLVMRustSetVisibility(Global: ValueRef, Viz: Visibility);
659662
pub fn LLVMGetAlignment(Global: ValueRef) -> c_uint;
660663
pub fn LLVMSetAlignment(Global: ValueRef, Bytes: c_uint);
661664
pub fn LLVMSetDLLStorageClass(V: ValueRef, C: DLLStorageClass);

src/librustc_trans/declare.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ fn declare_raw_fn(ccx: &CrateContext, name: &str, callconv: llvm::CallConv, ty:
7878
// don't want the symbols to get exported.
7979
if attr::contains_name(ccx.tcx().map.krate_attrs(), "compiler_builtins") {
8080
unsafe {
81-
llvm::LLVMSetVisibility(llfn, llvm::Visibility::Hidden);
81+
llvm::LLVMRustSetVisibility(llfn, llvm::Visibility::Hidden);
8282
}
8383
}
8484

src/rustllvm/RustWrapper.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1408,3 +1408,45 @@ extern "C" void LLVMRustSetLinkage(LLVMValueRef V, LLVMRustLinkage RustLinkage)
14081408
extern "C" LLVMContextRef LLVMRustGetValueContext(LLVMValueRef V) {
14091409
return wrap(&unwrap(V)->getContext());
14101410
}
1411+
1412+
enum class LLVMRustVisibility {
1413+
Default = 0,
1414+
Hidden = 1,
1415+
Protected = 2,
1416+
};
1417+
1418+
static LLVMRustVisibility to_rust(LLVMVisibility vis) {
1419+
switch (vis) {
1420+
case LLVMDefaultVisibility:
1421+
return LLVMRustVisibility::Default;
1422+
case LLVMHiddenVisibility:
1423+
return LLVMRustVisibility::Hidden;
1424+
case LLVMProtectedVisibility:
1425+
return LLVMRustVisibility::Protected;
1426+
1427+
default:
1428+
llvm_unreachable("Invalid LLVMRustVisibility value!");
1429+
}
1430+
}
1431+
1432+
static LLVMVisibility from_rust(LLVMRustVisibility vis) {
1433+
switch (vis) {
1434+
case LLVMRustVisibility::Default:
1435+
return LLVMDefaultVisibility;
1436+
case LLVMRustVisibility::Hidden:
1437+
return LLVMHiddenVisibility;
1438+
case LLVMRustVisibility::Protected:
1439+
return LLVMProtectedVisibility;
1440+
1441+
default:
1442+
llvm_unreachable("Invalid LLVMRustVisibility value!");
1443+
}
1444+
}
1445+
1446+
extern "C" LLVMRustVisibility LLVMRustGetVisibility(LLVMValueRef V) {
1447+
return to_rust(LLVMGetVisibility(V));
1448+
}
1449+
1450+
extern "C" void LLVMRustSetVisibility(LLVMValueRef V, LLVMRustVisibility RustVisibility) {
1451+
LLVMSetVisibility(V, from_rust(RustVisibility));
1452+
}

0 commit comments

Comments
 (0)