Skip to content

Commit ce87180

Browse files
committed
Use safe wrappers get_linkage and set_linkage
1 parent aa14cb8 commit ce87180

File tree

9 files changed

+60
-61
lines changed

9 files changed

+60
-61
lines changed

compiler/rustc_codegen_llvm/src/back/write.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,7 +1043,7 @@ unsafe fn embed_bitcode(
10431043

10441044
let section = bitcode_section_name(cgcx);
10451045
llvm::LLVMSetSection(llglobal, section.as_ptr().cast());
1046-
llvm::LLVMRustSetLinkage(llglobal, llvm::Linkage::PrivateLinkage);
1046+
llvm::set_linkage(llglobal, llvm::Linkage::PrivateLinkage);
10471047
llvm::LLVMSetGlobalConstant(llglobal, llvm::True);
10481048

10491049
let llconst = common::bytes_in_context(llcx, cmdline.as_bytes());
@@ -1061,7 +1061,7 @@ unsafe fn embed_bitcode(
10611061
c".llvmcmd"
10621062
};
10631063
llvm::LLVMSetSection(llglobal, section.as_ptr());
1064-
llvm::LLVMRustSetLinkage(llglobal, llvm::Linkage::PrivateLinkage);
1064+
llvm::set_linkage(llglobal, llvm::Linkage::PrivateLinkage);
10651065
} else {
10661066
// We need custom section flags, so emit module-level inline assembly.
10671067
let section_flags = if cgcx.is_pe_coff { "n" } else { "e" };
@@ -1096,7 +1096,7 @@ fn create_msvc_imps(
10961096
let ptr_ty = Type::ptr_llcx(llcx);
10971097
let globals = base::iter_globals(llmod)
10981098
.filter(|&val| {
1099-
llvm::LLVMRustGetLinkage(val) == llvm::Linkage::ExternalLinkage
1099+
llvm::get_linkage(val) == llvm::Linkage::ExternalLinkage
11001100
&& llvm::LLVMIsDeclaration(val) == 0
11011101
})
11021102
.filter_map(|val| {
@@ -1115,7 +1115,7 @@ fn create_msvc_imps(
11151115
for (imp_name, val) in globals {
11161116
let imp = llvm::LLVMAddGlobal(llmod, ptr_ty, imp_name.as_ptr());
11171117
llvm::LLVMSetInitializer(imp, val);
1118-
llvm::LLVMRustSetLinkage(imp, llvm::Linkage::ExternalLinkage);
1118+
llvm::set_linkage(imp, llvm::Linkage::ExternalLinkage);
11191119
}
11201120
}
11211121

compiler/rustc_codegen_llvm/src/callee.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,9 @@ pub(crate) fn get_fn<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>, instance: Instance<'t
9595
// whether we are sharing generics or not. The important thing here is
9696
// that the visibility we apply to the declaration is the same one that
9797
// has been applied to the definition (wherever that definition may be).
98-
unsafe {
99-
llvm::LLVMRustSetLinkage(llfn, llvm::Linkage::ExternalLinkage);
10098

99+
llvm::set_linkage(llfn, llvm::Linkage::ExternalLinkage);
100+
unsafe {
101101
let is_generic =
102102
instance.args.non_erasable_generics(tcx, instance.def_id()).next().is_some();
103103

compiler/rustc_codegen_llvm/src/common.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,8 @@ impl<'ll, 'tcx> ConstCodegenMethods<'tcx> for CodegenCx<'ll, 'tcx> {
219219
llvm::LLVMSetInitializer(g, sc);
220220
llvm::LLVMSetGlobalConstant(g, True);
221221
llvm::LLVMSetUnnamedAddress(g, llvm::UnnamedAddr::Global);
222-
llvm::LLVMRustSetLinkage(g, llvm::Linkage::InternalLinkage);
223222
}
223+
llvm::set_linkage(g, llvm::Linkage::InternalLinkage);
224224
(s.to_owned(), g)
225225
})
226226
.1;

compiler/rustc_codegen_llvm/src/consts.rs

Lines changed: 38 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -172,29 +172,27 @@ fn check_and_apply_linkage<'ll, 'tcx>(
172172
if let Some(linkage) = attrs.import_linkage {
173173
debug!("get_static: sym={} linkage={:?}", sym, linkage);
174174

175-
unsafe {
176-
// Declare a symbol `foo` with the desired linkage.
177-
let g1 = cx.declare_global(sym, cx.type_i8());
178-
llvm::LLVMRustSetLinkage(g1, base::linkage_to_llvm(linkage));
179-
180-
// Declare an internal global `extern_with_linkage_foo` which
181-
// is initialized with the address of `foo`. If `foo` is
182-
// discarded during linking (for example, if `foo` has weak
183-
// linkage and there are no definitions), then
184-
// `extern_with_linkage_foo` will instead be initialized to
185-
// zero.
186-
let mut real_name = "_rust_extern_with_linkage_".to_string();
187-
real_name.push_str(sym);
188-
let g2 = cx.define_global(&real_name, llty).unwrap_or_else(|| {
189-
cx.sess().dcx().emit_fatal(SymbolAlreadyDefined {
190-
span: cx.tcx.def_span(def_id),
191-
symbol_name: sym,
192-
})
193-
});
194-
llvm::LLVMRustSetLinkage(g2, llvm::Linkage::InternalLinkage);
195-
llvm::LLVMSetInitializer(g2, g1);
196-
g2
197-
}
175+
// Declare a symbol `foo` with the desired linkage.
176+
let g1 = cx.declare_global(sym, cx.type_i8());
177+
llvm::set_linkage(g1, base::linkage_to_llvm(linkage));
178+
179+
// Declare an internal global `extern_with_linkage_foo` which
180+
// is initialized with the address of `foo`. If `foo` is
181+
// discarded during linking (for example, if `foo` has weak
182+
// linkage and there are no definitions), then
183+
// `extern_with_linkage_foo` will instead be initialized to
184+
// zero.
185+
let mut real_name = "_rust_extern_with_linkage_".to_string();
186+
real_name.push_str(sym);
187+
let g2 = cx.define_global(&real_name, llty).unwrap_or_else(|| {
188+
cx.sess().dcx().emit_fatal(SymbolAlreadyDefined {
189+
span: cx.tcx.def_span(def_id),
190+
symbol_name: sym,
191+
})
192+
});
193+
llvm::set_linkage(g2, llvm::Linkage::InternalLinkage);
194+
unsafe { llvm::LLVMSetInitializer(g2, g1) };
195+
g2
198196
} else if cx.tcx.sess.target.arch == "x86"
199197
&& let Some(dllimport) = crate::common::get_dllimport(cx.tcx, def_id, sym)
200198
{
@@ -224,23 +222,21 @@ impl<'ll> CodegenCx<'ll, '_> {
224222
align: Align,
225223
kind: Option<&str>,
226224
) -> &'ll Value {
227-
unsafe {
228-
let gv = match kind {
229-
Some(kind) if !self.tcx.sess.fewer_names() => {
230-
let name = self.generate_local_symbol_name(kind);
231-
let gv = self.define_global(&name, self.val_ty(cv)).unwrap_or_else(|| {
232-
bug!("symbol `{}` is already defined", name);
233-
});
234-
llvm::LLVMRustSetLinkage(gv, llvm::Linkage::PrivateLinkage);
235-
gv
236-
}
237-
_ => self.define_private_global(self.val_ty(cv)),
238-
};
239-
llvm::LLVMSetInitializer(gv, cv);
240-
set_global_alignment(self, gv, align);
241-
llvm::SetUnnamedAddress(gv, llvm::UnnamedAddr::Global);
242-
gv
243-
}
225+
let gv = match kind {
226+
Some(kind) if !self.tcx.sess.fewer_names() => {
227+
let name = self.generate_local_symbol_name(kind);
228+
let gv = self.define_global(&name, self.val_ty(cv)).unwrap_or_else(|| {
229+
bug!("symbol `{}` is already defined", name);
230+
});
231+
llvm::set_linkage(gv, llvm::Linkage::PrivateLinkage);
232+
gv
233+
}
234+
_ => self.define_private_global(self.val_ty(cv)),
235+
};
236+
unsafe { llvm::LLVMSetInitializer(gv, cv) };
237+
set_global_alignment(self, gv, align);
238+
llvm::SetUnnamedAddress(gv, llvm::UnnamedAddr::Global);
239+
gv
244240
}
245241

246242
#[instrument(level = "debug", skip(self))]
@@ -401,7 +397,7 @@ impl<'ll> CodegenCx<'ll, '_> {
401397
let name = llvm::get_value_name(g).to_vec();
402398
llvm::set_value_name(g, b"");
403399

404-
let linkage = llvm::LLVMRustGetLinkage(g);
400+
let linkage = llvm::get_linkage(g);
405401
let visibility = llvm::LLVMRustGetVisibility(g);
406402

407403
let new_g = llvm::LLVMRustGetOrInsertGlobal(
@@ -411,7 +407,7 @@ impl<'ll> CodegenCx<'ll, '_> {
411407
val_llty,
412408
);
413409

414-
llvm::LLVMRustSetLinkage(new_g, linkage);
410+
llvm::set_linkage(new_g, linkage);
415411
llvm::LLVMRustSetVisibility(new_g, visibility);
416412

417413
// The old global has had its name removed but is returned by

compiler/rustc_codegen_llvm/src/context.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
605605
unsafe {
606606
let g = llvm::LLVMAddGlobal(self.llmod, self.val_ty(array), name.as_ptr());
607607
llvm::LLVMSetInitializer(g, array);
608-
llvm::LLVMRustSetLinkage(g, llvm::Linkage::AppendingLinkage);
608+
llvm::set_linkage(g, llvm::Linkage::AppendingLinkage);
609609
llvm::LLVMSetSection(g, c"llvm.metadata".as_ptr());
610610
}
611611
}

compiler/rustc_codegen_llvm/src/debuginfo/gdb.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ pub(crate) fn get_or_insert_gdb_debug_scripts_section_global<'ll>(
7676
llvm::LLVMSetInitializer(section_var, cx.const_bytes(section_contents));
7777
llvm::LLVMSetGlobalConstant(section_var, llvm::True);
7878
llvm::LLVMSetUnnamedAddress(section_var, llvm::UnnamedAddr::Global);
79-
llvm::LLVMRustSetLinkage(section_var, llvm::Linkage::LinkOnceODRLinkage);
79+
llvm::set_linkage(section_var, llvm::Linkage::LinkOnceODRLinkage);
8080
// This should make sure that the whole section is not larger than
8181
// the string it contains. Otherwise we get a warning from GDB.
8282
llvm::LLVMSetAlignment(section_var, 1);

compiler/rustc_codegen_llvm/src/intrinsic.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -785,13 +785,12 @@ fn codegen_msvc_try<'ll>(
785785
let type_info =
786786
bx.const_struct(&[type_info_vtable, bx.const_null(bx.type_ptr()), type_name], false);
787787
let tydesc = bx.declare_global("__rust_panic_type_info", bx.val_ty(type_info));
788-
unsafe {
789-
llvm::LLVMRustSetLinkage(tydesc, llvm::Linkage::LinkOnceODRLinkage);
790-
if bx.cx.tcx.sess.target.supports_comdat() {
791-
llvm::SetUniqueComdat(bx.llmod, tydesc);
792-
}
793-
llvm::LLVMSetInitializer(tydesc, type_info);
788+
789+
llvm::set_linkage(tydesc, llvm::Linkage::LinkOnceODRLinkage);
790+
if bx.cx.tcx.sess.target.supports_comdat() {
791+
llvm::SetUniqueComdat(bx.llmod, tydesc);
794792
}
793+
unsafe { llvm::LLVMSetInitializer(tydesc, type_info) };
795794

796795
// The flag value of 8 indicates that we are catching the exception by
797796
// reference instead of by value. We can't use catch by value because
@@ -1064,7 +1063,7 @@ fn gen_fn<'ll, 'tcx>(
10641063
cx.set_frame_pointer_type(llfn);
10651064
cx.apply_target_cpu_attr(llfn);
10661065
// FIXME(eddyb) find a nicer way to do this.
1067-
unsafe { llvm::LLVMRustSetLinkage(llfn, llvm::Linkage::InternalLinkage) };
1066+
llvm::set_linkage(llfn, llvm::Linkage::InternalLinkage);
10681067
let llbb = Builder::append_block(cx, llfn, "entry-block");
10691068
let bx = Builder::build(cx, llbb);
10701069
codegen(bx);

compiler/rustc_codegen_llvm/src/llvm/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,10 @@ pub fn set_global_constant(llglobal: &Value, is_constant: bool) {
232232
}
233233
}
234234

235+
pub fn get_linkage(llglobal: &Value) -> Linkage {
236+
unsafe { LLVMRustGetLinkage(llglobal) }
237+
}
238+
235239
pub fn set_linkage(llglobal: &Value, linkage: Linkage) {
236240
unsafe {
237241
LLVMRustSetLinkage(llglobal, linkage);

compiler/rustc_codegen_llvm/src/mono_item.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ impl<'tcx> PreDefineCodegenMethods<'tcx> for CodegenCx<'_, 'tcx> {
3939
.emit_fatal(SymbolAlreadyDefined { span: self.tcx.def_span(def_id), symbol_name })
4040
});
4141

42+
llvm::set_linkage(g, base::linkage_to_llvm(linkage));
4243
unsafe {
43-
llvm::LLVMRustSetLinkage(g, base::linkage_to_llvm(linkage));
4444
llvm::LLVMRustSetVisibility(g, base::visibility_to_llvm(visibility));
4545
if self.should_assume_dso_local(g, false) {
4646
llvm::LLVMRustSetDSOLocal(g, true);
@@ -61,7 +61,7 @@ impl<'tcx> PreDefineCodegenMethods<'tcx> for CodegenCx<'_, 'tcx> {
6161

6262
let fn_abi = self.fn_abi_of_instance(instance, ty::List::empty());
6363
let lldecl = self.declare_fn(symbol_name, fn_abi, Some(instance));
64-
unsafe { llvm::LLVMRustSetLinkage(lldecl, base::linkage_to_llvm(linkage)) };
64+
llvm::set_linkage(lldecl, base::linkage_to_llvm(linkage));
6565
let attrs = self.tcx.codegen_fn_attrs(instance.def_id());
6666
base::set_link_section(lldecl, attrs);
6767
if (linkage == Linkage::LinkOnceODR || linkage == Linkage::WeakODR)
@@ -107,7 +107,7 @@ impl CodegenCx<'_, '_> {
107107
llval: &llvm::Value,
108108
is_declaration: bool,
109109
) -> bool {
110-
let linkage = unsafe { llvm::LLVMRustGetLinkage(llval) };
110+
let linkage = llvm::get_linkage(llval);
111111
let visibility = unsafe { llvm::LLVMRustGetVisibility(llval) };
112112

113113
if matches!(linkage, llvm::Linkage::InternalLinkage | llvm::Linkage::PrivateLinkage) {

0 commit comments

Comments
 (0)