Make LLVM symbol visibility FFI types more stable.
This commit is contained in:
parent
692d7cfb0c
commit
d1a6d47f94
3 changed files with 54 additions and 9 deletions
|
@ -64,6 +64,15 @@ pub enum Linkage {
|
||||||
CommonLinkage = 10,
|
CommonLinkage = 10,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LLVMRustVisibility
|
||||||
|
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
|
||||||
|
#[repr(C)]
|
||||||
|
pub enum Visibility {
|
||||||
|
Default = 0,
|
||||||
|
Hidden = 1,
|
||||||
|
Protected = 2,
|
||||||
|
}
|
||||||
|
|
||||||
/// LLVMDiagnosticSeverity
|
/// LLVMDiagnosticSeverity
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
|
@ -399,13 +408,6 @@ pub type OperandBundleDefRef = *mut OperandBundleDef_opaque;
|
||||||
pub type DiagnosticHandler = unsafe extern "C" fn(DiagnosticInfoRef, *mut c_void);
|
pub type DiagnosticHandler = unsafe extern "C" fn(DiagnosticInfoRef, *mut c_void);
|
||||||
pub type InlineAsmDiagHandler = unsafe extern "C" fn(SMDiagnosticRef, *const c_void, c_uint);
|
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 {
|
pub mod debuginfo {
|
||||||
use super::MetadataRef;
|
use super::MetadataRef;
|
||||||
|
@ -655,7 +657,8 @@ extern "C" {
|
||||||
pub fn LLVMRustSetLinkage(Global: ValueRef, RustLinkage: Linkage);
|
pub fn LLVMRustSetLinkage(Global: ValueRef, RustLinkage: Linkage);
|
||||||
pub fn LLVMGetSection(Global: ValueRef) -> *const c_char;
|
pub fn LLVMGetSection(Global: ValueRef) -> *const c_char;
|
||||||
pub fn LLVMSetSection(Global: ValueRef, Section: *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 LLVMGetAlignment(Global: ValueRef) -> c_uint;
|
||||||
pub fn LLVMSetAlignment(Global: ValueRef, Bytes: c_uint);
|
pub fn LLVMSetAlignment(Global: ValueRef, Bytes: c_uint);
|
||||||
pub fn LLVMSetDLLStorageClass(V: ValueRef, C: DLLStorageClass);
|
pub fn LLVMSetDLLStorageClass(V: ValueRef, C: DLLStorageClass);
|
||||||
|
|
|
@ -78,7 +78,7 @@ fn declare_raw_fn(ccx: &CrateContext, name: &str, callconv: llvm::CallConv, ty:
|
||||||
// don't want the symbols to get exported.
|
// don't want the symbols to get exported.
|
||||||
if attr::contains_name(ccx.tcx().map.krate_attrs(), "compiler_builtins") {
|
if attr::contains_name(ccx.tcx().map.krate_attrs(), "compiler_builtins") {
|
||||||
unsafe {
|
unsafe {
|
||||||
llvm::LLVMSetVisibility(llfn, llvm::Visibility::Hidden);
|
llvm::LLVMRustSetVisibility(llfn, llvm::Visibility::Hidden);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1408,3 +1408,45 @@ extern "C" void LLVMRustSetLinkage(LLVMValueRef V, LLVMRustLinkage RustLinkage)
|
||||||
extern "C" LLVMContextRef LLVMRustGetValueContext(LLVMValueRef V) {
|
extern "C" LLVMContextRef LLVMRustGetValueContext(LLVMValueRef V) {
|
||||||
return wrap(&unwrap(V)->getContext());
|
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));
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue