Skip to content

Commit 96993a9

Browse files
committed
Use LLVM-C APIs for getting/setting linkage
1 parent ec41e6d commit 96993a9

File tree

3 files changed

+24
-93
lines changed

3 files changed

+24
-93
lines changed

compiler/rustc_codegen_llvm/src/llvm/ffi.rs

+22-11
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::fmt::Debug;
55
use std::marker::PhantomData;
66

77
use libc::{c_char, c_int, c_uint, c_ulonglong, c_void, size_t};
8+
use rustc_macros::TryFromU32;
89
use rustc_target::spec::SymbolVisibility;
910

1011
use super::RustString;
@@ -133,21 +134,31 @@ pub enum CallConv {
133134
AvrInterrupt = 85,
134135
}
135136

136-
/// LLVMRustLinkage
137-
#[derive(Copy, Clone, PartialEq)]
137+
/// Must match the layout of `LLVMLinkage`.
138+
#[derive(Copy, Clone, PartialEq, TryFromU32)]
138139
#[repr(C)]
139140
pub enum Linkage {
140141
ExternalLinkage = 0,
141142
AvailableExternallyLinkage = 1,
142143
LinkOnceAnyLinkage = 2,
143144
LinkOnceODRLinkage = 3,
144-
WeakAnyLinkage = 4,
145-
WeakODRLinkage = 5,
146-
AppendingLinkage = 6,
147-
InternalLinkage = 7,
148-
PrivateLinkage = 8,
149-
ExternalWeakLinkage = 9,
150-
CommonLinkage = 10,
145+
#[deprecated = "marked obsolete by LLVM"]
146+
LinkOnceODRAutoHideLinkage = 4,
147+
WeakAnyLinkage = 5,
148+
WeakODRLinkage = 6,
149+
AppendingLinkage = 7,
150+
InternalLinkage = 8,
151+
PrivateLinkage = 9,
152+
#[deprecated = "marked obsolete by LLVM"]
153+
DLLImportLinkage = 10,
154+
#[deprecated = "marked obsolete by LLVM"]
155+
DLLExportLinkage = 11,
156+
ExternalWeakLinkage = 12,
157+
#[deprecated = "marked obsolete by LLVM"]
158+
GhostLinkage = 13,
159+
CommonLinkage = 14,
160+
LinkerPrivateLinkage = 15,
161+
LinkerPrivateWeakLinkage = 16,
151162
}
152163

153164
// LLVMRustVisibility
@@ -970,6 +981,8 @@ unsafe extern "C" {
970981

971982
// Operations on global variables, functions, and aliases (globals)
972983
pub fn LLVMIsDeclaration(Global: &Value) -> Bool;
984+
pub fn LLVMGetLinkage(Global: &Value) -> RawEnum<Linkage>;
985+
pub fn LLVMSetLinkage(Global: &Value, RustLinkage: Linkage);
973986
pub fn LLVMSetSection(Global: &Value, Section: *const c_char);
974987
pub fn LLVMGetAlignment(Global: &Value) -> c_uint;
975988
pub fn LLVMSetAlignment(Global: &Value, Bytes: c_uint);
@@ -1546,8 +1559,6 @@ unsafe extern "C" {
15461559
) -> bool;
15471560

15481561
// Operations on global variables, functions, and aliases (globals)
1549-
pub fn LLVMRustGetLinkage(Global: &Value) -> Linkage;
1550-
pub fn LLVMRustSetLinkage(Global: &Value, RustLinkage: Linkage);
15511562
pub fn LLVMRustGetVisibility(Global: &Value) -> Visibility;
15521563
pub fn LLVMRustSetVisibility(Global: &Value, Viz: Visibility);
15531564
pub fn LLVMRustSetDSOLocal(Global: &Value, is_dso_local: bool);

compiler/rustc_codegen_llvm/src/llvm/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -233,12 +233,12 @@ pub fn set_global_constant(llglobal: &Value, is_constant: bool) {
233233
}
234234

235235
pub fn get_linkage(llglobal: &Value) -> Linkage {
236-
unsafe { LLVMRustGetLinkage(llglobal) }
236+
unsafe { LLVMGetLinkage(llglobal) }.to_rust()
237237
}
238238

239239
pub fn set_linkage(llglobal: &Value, linkage: Linkage) {
240240
unsafe {
241-
LLVMRustSetLinkage(llglobal, linkage);
241+
LLVMSetLinkage(llglobal, linkage);
242242
}
243243
}
244244

compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp

-80
Original file line numberDiff line numberDiff line change
@@ -1619,86 +1619,6 @@ extern "C" void LLVMRustPositionBuilderAtStart(LLVMBuilderRef B,
16191619
unwrap(B)->SetInsertPoint(unwrap(BB), Point);
16201620
}
16211621

1622-
enum class LLVMRustLinkage {
1623-
ExternalLinkage = 0,
1624-
AvailableExternallyLinkage = 1,
1625-
LinkOnceAnyLinkage = 2,
1626-
LinkOnceODRLinkage = 3,
1627-
WeakAnyLinkage = 4,
1628-
WeakODRLinkage = 5,
1629-
AppendingLinkage = 6,
1630-
InternalLinkage = 7,
1631-
PrivateLinkage = 8,
1632-
ExternalWeakLinkage = 9,
1633-
CommonLinkage = 10,
1634-
};
1635-
1636-
static LLVMRustLinkage toRust(LLVMLinkage Linkage) {
1637-
switch (Linkage) {
1638-
case LLVMExternalLinkage:
1639-
return LLVMRustLinkage::ExternalLinkage;
1640-
case LLVMAvailableExternallyLinkage:
1641-
return LLVMRustLinkage::AvailableExternallyLinkage;
1642-
case LLVMLinkOnceAnyLinkage:
1643-
return LLVMRustLinkage::LinkOnceAnyLinkage;
1644-
case LLVMLinkOnceODRLinkage:
1645-
return LLVMRustLinkage::LinkOnceODRLinkage;
1646-
case LLVMWeakAnyLinkage:
1647-
return LLVMRustLinkage::WeakAnyLinkage;
1648-
case LLVMWeakODRLinkage:
1649-
return LLVMRustLinkage::WeakODRLinkage;
1650-
case LLVMAppendingLinkage:
1651-
return LLVMRustLinkage::AppendingLinkage;
1652-
case LLVMInternalLinkage:
1653-
return LLVMRustLinkage::InternalLinkage;
1654-
case LLVMPrivateLinkage:
1655-
return LLVMRustLinkage::PrivateLinkage;
1656-
case LLVMExternalWeakLinkage:
1657-
return LLVMRustLinkage::ExternalWeakLinkage;
1658-
case LLVMCommonLinkage:
1659-
return LLVMRustLinkage::CommonLinkage;
1660-
default:
1661-
report_fatal_error("Invalid LLVMRustLinkage value!");
1662-
}
1663-
}
1664-
1665-
static LLVMLinkage fromRust(LLVMRustLinkage Linkage) {
1666-
switch (Linkage) {
1667-
case LLVMRustLinkage::ExternalLinkage:
1668-
return LLVMExternalLinkage;
1669-
case LLVMRustLinkage::AvailableExternallyLinkage:
1670-
return LLVMAvailableExternallyLinkage;
1671-
case LLVMRustLinkage::LinkOnceAnyLinkage:
1672-
return LLVMLinkOnceAnyLinkage;
1673-
case LLVMRustLinkage::LinkOnceODRLinkage:
1674-
return LLVMLinkOnceODRLinkage;
1675-
case LLVMRustLinkage::WeakAnyLinkage:
1676-
return LLVMWeakAnyLinkage;
1677-
case LLVMRustLinkage::WeakODRLinkage:
1678-
return LLVMWeakODRLinkage;
1679-
case LLVMRustLinkage::AppendingLinkage:
1680-
return LLVMAppendingLinkage;
1681-
case LLVMRustLinkage::InternalLinkage:
1682-
return LLVMInternalLinkage;
1683-
case LLVMRustLinkage::PrivateLinkage:
1684-
return LLVMPrivateLinkage;
1685-
case LLVMRustLinkage::ExternalWeakLinkage:
1686-
return LLVMExternalWeakLinkage;
1687-
case LLVMRustLinkage::CommonLinkage:
1688-
return LLVMCommonLinkage;
1689-
}
1690-
report_fatal_error("Invalid LLVMRustLinkage value!");
1691-
}
1692-
1693-
extern "C" LLVMRustLinkage LLVMRustGetLinkage(LLVMValueRef V) {
1694-
return toRust(LLVMGetLinkage(V));
1695-
}
1696-
1697-
extern "C" void LLVMRustSetLinkage(LLVMValueRef V,
1698-
LLVMRustLinkage RustLinkage) {
1699-
LLVMSetLinkage(V, fromRust(RustLinkage));
1700-
}
1701-
17021622
extern "C" bool LLVMRustConstIntGetZExtValue(LLVMValueRef CV, uint64_t *value) {
17031623
auto C = unwrap<llvm::ConstantInt>(CV);
17041624
if (C->getBitWidth() > 64)

0 commit comments

Comments
 (0)