Skip to content

Commit

Permalink
Make LLVM symbol visibility FFI types more stable.
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelwoerister committed Dec 5, 2016
1 parent 692d7cf commit d1a6d47
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 9 deletions.
19 changes: 11 additions & 8 deletions src/librustc_llvm/ffi.rs
Expand Up @@ -64,6 +64,15 @@ pub enum Linkage {
CommonLinkage = 10,
}

// LLVMRustVisibility
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
#[repr(C)]
pub enum Visibility {
Default = 0,
Hidden = 1,
Protected = 2,
}

/// LLVMDiagnosticSeverity
#[derive(Copy, Clone, Debug)]
#[repr(C)]
Expand Down Expand Up @@ -399,13 +408,6 @@ pub type OperandBundleDefRef = *mut OperandBundleDef_opaque;
pub type DiagnosticHandler = unsafe extern "C" fn(DiagnosticInfoRef, *mut c_void);
pub type InlineAsmDiagHandler = unsafe extern "C" fn(SMDiagnosticRef, *const c_void, c_uint);

/// LLVMVisibility
#[repr(C)]
pub enum Visibility {
Default,
Hidden,
Protected,
}

pub mod debuginfo {
use super::MetadataRef;
Expand Down Expand Up @@ -655,7 +657,8 @@ extern "C" {
pub fn LLVMRustSetLinkage(Global: ValueRef, RustLinkage: Linkage);
pub fn LLVMGetSection(Global: ValueRef) -> *const c_char;
pub fn LLVMSetSection(Global: ValueRef, Section: *const c_char);
pub fn LLVMSetVisibility(Global: ValueRef, Viz: Visibility);
pub fn LLVMRustGetVisibility(Global: ValueRef) -> Visibility;
pub fn LLVMRustSetVisibility(Global: ValueRef, Viz: Visibility);
pub fn LLVMGetAlignment(Global: ValueRef) -> c_uint;
pub fn LLVMSetAlignment(Global: ValueRef, Bytes: c_uint);
pub fn LLVMSetDLLStorageClass(V: ValueRef, C: DLLStorageClass);
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_trans/declare.rs
Expand Up @@ -78,7 +78,7 @@ fn declare_raw_fn(ccx: &CrateContext, name: &str, callconv: llvm::CallConv, ty:
// don't want the symbols to get exported.
if attr::contains_name(ccx.tcx().map.krate_attrs(), "compiler_builtins") {
unsafe {
llvm::LLVMSetVisibility(llfn, llvm::Visibility::Hidden);
llvm::LLVMRustSetVisibility(llfn, llvm::Visibility::Hidden);
}
}

Expand Down
42 changes: 42 additions & 0 deletions src/rustllvm/RustWrapper.cpp
Expand Up @@ -1408,3 +1408,45 @@ extern "C" void LLVMRustSetLinkage(LLVMValueRef V, LLVMRustLinkage RustLinkage)
extern "C" LLVMContextRef LLVMRustGetValueContext(LLVMValueRef V) {
return wrap(&unwrap(V)->getContext());
}

enum class LLVMRustVisibility {
Default = 0,
Hidden = 1,
Protected = 2,
};

static LLVMRustVisibility to_rust(LLVMVisibility vis) {
switch (vis) {
case LLVMDefaultVisibility:
return LLVMRustVisibility::Default;
case LLVMHiddenVisibility:
return LLVMRustVisibility::Hidden;
case LLVMProtectedVisibility:
return LLVMRustVisibility::Protected;

default:
llvm_unreachable("Invalid LLVMRustVisibility value!");
}
}

static LLVMVisibility from_rust(LLVMRustVisibility vis) {
switch (vis) {
case LLVMRustVisibility::Default:
return LLVMDefaultVisibility;
case LLVMRustVisibility::Hidden:
return LLVMHiddenVisibility;
case LLVMRustVisibility::Protected:
return LLVMProtectedVisibility;

default:
llvm_unreachable("Invalid LLVMRustVisibility value!");
}
}

extern "C" LLVMRustVisibility LLVMRustGetVisibility(LLVMValueRef V) {
return to_rust(LLVMGetVisibility(V));
}

extern "C" void LLVMRustSetVisibility(LLVMValueRef V, LLVMRustVisibility RustVisibility) {
LLVMSetVisibility(V, from_rust(RustVisibility));
}

0 comments on commit d1a6d47

Please sign in to comment.