Skip to content

Commit 63a9cf2

Browse files
authored
Merge pull request rust-lang#81 from hansihe/master
Add ability to set linkage on GlobalValues
2 parents 4ce5375 + 85f0440 commit 63a9cf2

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

src/values/global_value.rs

+16-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
use llvm_sys::LLVMThreadLocalMode;
2-
use llvm_sys::core::{LLVMGetVisibility, LLVMSetVisibility, LLVMGetSection, LLVMSetSection, LLVMIsExternallyInitialized, LLVMSetExternallyInitialized, LLVMDeleteGlobal, LLVMIsGlobalConstant, LLVMSetGlobalConstant, LLVMGetPreviousGlobal, LLVMGetNextGlobal, LLVMHasUnnamedAddr, LLVMSetUnnamedAddr, LLVMIsThreadLocal, LLVMSetThreadLocal, LLVMGetThreadLocalMode, LLVMSetThreadLocalMode, LLVMGetInitializer, LLVMSetInitializer, LLVMIsDeclaration, LLVMGetDLLStorageClass, LLVMSetDLLStorageClass, LLVMGetAlignment, LLVMSetAlignment};
2+
use llvm_sys::core::{LLVMGetVisibility, LLVMSetVisibility, LLVMGetSection, LLVMSetSection, LLVMIsExternallyInitialized, LLVMSetExternallyInitialized, LLVMDeleteGlobal, LLVMIsGlobalConstant, LLVMSetGlobalConstant, LLVMGetPreviousGlobal, LLVMGetNextGlobal, LLVMHasUnnamedAddr, LLVMSetUnnamedAddr, LLVMIsThreadLocal, LLVMSetThreadLocal, LLVMGetThreadLocalMode, LLVMSetThreadLocalMode, LLVMGetInitializer, LLVMSetInitializer, LLVMIsDeclaration, LLVMGetDLLStorageClass, LLVMSetDLLStorageClass, LLVMGetAlignment, LLVMSetAlignment, LLVMGetLinkage, LLVMSetLinkage};
33
#[llvm_versions(7.0 => latest)]
44
use llvm_sys::LLVMUnnamedAddr;
55
use llvm_sys::prelude::LLVMValueRef;
66

77
use std::ffi::{CString, CStr};
88

99
use crate::{GlobalVisibility, ThreadLocalMode, DLLStorageClass};
10+
use crate::module::Linkage;
1011
use crate::support::LLVMString;
1112
#[llvm_versions(7.0 => latest)]
1213
use crate::comdat::Comdat;
@@ -277,6 +278,20 @@ impl GlobalValue {
277278
}
278279
}
279280

281+
pub fn get_linkage(&self) -> Linkage {
282+
let linkage = unsafe {
283+
LLVMGetLinkage(self.as_value_ref())
284+
};
285+
286+
Linkage::new(linkage)
287+
}
288+
289+
pub fn set_linkage(&self, linkage: Linkage) {
290+
unsafe {
291+
LLVMSetLinkage(self.as_value_ref(), linkage.as_llvm_enum())
292+
}
293+
}
294+
280295
pub fn print_to_string(&self) -> LLVMString {
281296
self.global_value.print_to_string()
282297
}

tests/all/test_values.rs

+7
Original file line numberDiff line numberDiff line change
@@ -815,6 +815,7 @@ fn test_globals() {
815815
assert_eq!(global.get_section(), &*CString::new("").unwrap());
816816
assert_eq!(global.get_dll_storage_class(), DLLStorageClass::default());
817817
assert_eq!(global.get_visibility(), GlobalVisibility::default());
818+
assert_eq!(global.get_linkage(), External);
818819
assert_eq!(module.get_first_global().unwrap(), global);
819820
assert_eq!(module.get_last_global().unwrap(), global);
820821
assert_eq!(module.get_global("my_global").unwrap(), global);
@@ -844,6 +845,12 @@ fn test_globals() {
844845
assert!(!global.is_declaration());
845846
assert_eq!(global.get_section(), &*CString::new("not sure what goes here").unwrap());
846847

848+
global.set_linkage(Private);
849+
850+
assert_eq!(global.get_linkage(), Private);
851+
// Setting linkage seems to reset visibility
852+
assert_eq!(global.get_visibility(), GlobalVisibility::Default);
853+
847854
#[cfg(not(any(feature = "llvm3-6", feature = "llvm3-7", feature = "llvm3-8", feature = "llvm3-9",
848855
feature = "llvm4-0", feature = "llvm5-0", feature = "llvm6-0")))]
849856
global.set_unnamed_address(UnnamedAddress::Global);

0 commit comments

Comments
 (0)