Skip to content

Commit 696691e

Browse files
arielb1Ariel Ben-Yehuda
authored and
Ariel Ben-Yehuda
committed
audit LLVM C++ types in ArchiveWrapper and PassWrapper
1 parent 81df89f commit 696691e

File tree

8 files changed

+275
-114
lines changed

8 files changed

+275
-114
lines changed

src/librustc_llvm/lib.rs

+48-28
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,9 @@ pub use self::TypeKind::*;
4040
pub use self::AtomicBinOp::*;
4141
pub use self::AtomicOrdering::*;
4242
pub use self::SynchronizationScope::*;
43-
pub use self::FileType::*;
4443
pub use self::MetadataType::*;
4544
pub use self::AsmDialect::*;
46-
pub use self::CodeGenOptLevel::*;
4745
pub use self::CodeGenOptSize::*;
48-
pub use self::RelocMode::*;
49-
pub use self::CodeGenModel::*;
5046
pub use self::DiagnosticKind::*;
5147
pub use self::CallConv::*;
5248
pub use self::Visibility::*;
@@ -75,9 +71,26 @@ pub type Bool = c_uint;
7571
pub const True: Bool = 1 as Bool;
7672
pub const False: Bool = 0 as Bool;
7773

74+
#[repr(C)]
75+
#[derive(Copy, Clone, PartialEq)]
76+
pub enum LLVMRustResult {
77+
Success = 0,
78+
Failure = 1
79+
}
80+
81+
impl LLVMRustResult {
82+
pub fn into_result(self) -> Result<(), ()> {
83+
match self {
84+
LLVMRustResult::Success => Ok(()),
85+
LLVMRustResult::Failure => Err(()),
86+
}
87+
}
88+
}
89+
7890
// Consts for the LLVM CallConv type, pre-cast to usize.
7991

8092
#[derive(Copy, Clone, PartialEq)]
93+
#[repr(C)]
8194
pub enum CallConv {
8295
CCallConv = 0,
8396
FastCallConv = 8,
@@ -89,6 +102,7 @@ pub enum CallConv {
89102
}
90103

91104
#[derive(Copy, Clone)]
105+
#[repr(C)]
92106
pub enum Visibility {
93107
LLVMDefaultVisibility = 0,
94108
HiddenVisibility = 1,
@@ -100,6 +114,7 @@ pub enum Visibility {
100114
// LinkerPrivateLinkage and LinkerPrivateWeakLinkage are not included either;
101115
// they've been removed in upstream LLVM commit r203866.
102116
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
117+
#[repr(C)]
103118
pub enum Linkage {
104119
ExternalLinkage = 0,
105120
AvailableExternallyLinkage = 1,
@@ -337,12 +352,12 @@ pub enum SynchronizationScope {
337352
CrossThread = 1
338353
}
339354

340-
// Consts for the LLVMCodeGenFileType type (in include/llvm/c/TargetMachine.h)
341355
#[repr(C)]
342356
#[derive(Copy, Clone)]
343357
pub enum FileType {
344-
AssemblyFileType = 0,
345-
ObjectFileType = 1
358+
Other,
359+
AssemblyFile,
360+
ObjectFile,
346361
}
347362

348363
#[derive(Copy, Clone)]
@@ -371,10 +386,11 @@ pub enum AsmDialect {
371386
#[derive(Copy, Clone, PartialEq)]
372387
#[repr(C)]
373388
pub enum CodeGenOptLevel {
374-
CodeGenLevelNone = 0,
375-
CodeGenLevelLess = 1,
376-
CodeGenLevelDefault = 2,
377-
CodeGenLevelAggressive = 3,
389+
Other,
390+
None,
391+
Less,
392+
Default,
393+
Aggressive,
378394
}
379395

380396
#[derive(Copy, Clone, PartialEq)]
@@ -388,21 +404,22 @@ pub enum CodeGenOptSize {
388404
#[derive(Copy, Clone, PartialEq)]
389405
#[repr(C)]
390406
pub enum RelocMode {
391-
RelocDefault = 0,
392-
RelocStatic = 1,
393-
RelocPIC = 2,
394-
RelocDynamicNoPic = 3,
407+
Default = 0,
408+
Static = 1,
409+
PIC = 2,
410+
DynamicNoPic = 3,
395411
}
396412

397413
#[repr(C)]
398414
#[derive(Copy, Clone)]
399-
pub enum CodeGenModel {
400-
CodeModelDefault = 0,
401-
CodeModelJITDefault = 1,
402-
CodeModelSmall = 2,
403-
CodeModelKernel = 3,
404-
CodeModelMedium = 4,
405-
CodeModelLarge = 5,
415+
pub enum CodeModel {
416+
Other,
417+
Default,
418+
JITDefault,
419+
Small,
420+
Kernel,
421+
Medium,
422+
Large,
406423
}
407424

408425
#[repr(C)]
@@ -421,6 +438,7 @@ pub enum DiagnosticKind {
421438
#[repr(C)]
422439
#[derive(Copy, Clone)]
423440
pub enum ArchiveKind {
441+
Other,
424442
K_GNU,
425443
K_MIPS64,
426444
K_BSD,
@@ -444,10 +462,10 @@ impl FromStr for ArchiveKind {
444462
/// Represents the different LLVM passes Rust supports
445463
#[derive(Copy, Clone, PartialEq, Debug)]
446464
#[repr(C)]
447-
pub enum SupportedPassKind {
465+
pub enum PassKind {
466+
Other,
448467
Function,
449468
Module,
450-
Unsupported,
451469
}
452470

453471
// Opaque pointer types
@@ -2021,7 +2039,7 @@ extern {
20212039
pub fn LLVMIsAAllocaInst(value_ref: ValueRef) -> ValueRef;
20222040
pub fn LLVMIsAConstantInt(value_ref: ValueRef) -> ValueRef;
20232041

2024-
pub fn LLVMRustPassKind(Pass: PassRef) -> SupportedPassKind;
2042+
pub fn LLVMRustPassKind(Pass: PassRef) -> PassKind;
20252043
pub fn LLVMRustFindAndCreatePass(Pass: *const c_char) -> PassRef;
20262044
pub fn LLVMRustAddPass(PM: PassManagerRef, Pass: PassRef);
20272045

@@ -2031,7 +2049,7 @@ extern {
20312049
pub fn LLVMRustCreateTargetMachine(Triple: *const c_char,
20322050
CPU: *const c_char,
20332051
Features: *const c_char,
2034-
Model: CodeGenModel,
2052+
Model: CodeModel,
20352053
Reloc: RelocMode,
20362054
Level: CodeGenOptLevel,
20372055
UseSoftFP: bool,
@@ -2057,7 +2075,8 @@ extern {
20572075
PM: PassManagerRef,
20582076
M: ModuleRef,
20592077
Output: *const c_char,
2060-
FileType: FileType) -> bool;
2078+
FileType: FileType)
2079+
-> LLVMRustResult;
20612080
pub fn LLVMRustPrintModule(PM: PassManagerRef,
20622081
M: ModuleRef,
20632082
Output: *const c_char);
@@ -2123,7 +2142,8 @@ extern {
21232142
NumMembers: size_t,
21242143
Members: *const RustArchiveMemberRef,
21252144
WriteSymbtab: bool,
2126-
Kind: ArchiveKind) -> c_int;
2145+
Kind: ArchiveKind) ->
2146+
LLVMRustResult;
21272147
pub fn LLVMRustArchiveMemberNew(Filename: *const c_char,
21282148
Name: *const c_char,
21292149
Child: ArchiveChildRef) -> RustArchiveMemberRef;

src/librustc_trans/back/archive.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ impl<'a> ArchiveBuilder<'a> {
293293
members.as_ptr(),
294294
self.should_update_symbols,
295295
kind);
296-
let ret = if r != 0 {
296+
let ret = if r.into_result().is_err() {
297297
let err = llvm::LLVMRustGetLastError();
298298
let msg = if err.is_null() {
299299
"failed to write archive".to_string()

src/librustc_trans/back/write.rs

+25-21
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ pub fn write_output_file(
5454
let output_c = path2cstr(output);
5555
let result = llvm::LLVMRustWriteOutputFile(
5656
target, pm, m, output_c.as_ptr(), file_type);
57-
if !result {
57+
if result.into_result().is_err() {
5858
llvm_err(handler, format!("could not write output to {}", output.display()));
5959
}
6060
}
@@ -138,11 +138,11 @@ fn target_feature(sess: &Session) -> String {
138138

139139
fn get_llvm_opt_level(optimize: config::OptLevel) -> llvm::CodeGenOptLevel {
140140
match optimize {
141-
config::OptLevel::No => llvm::CodeGenLevelNone,
142-
config::OptLevel::Less => llvm::CodeGenLevelLess,
143-
config::OptLevel::Default => llvm::CodeGenLevelDefault,
144-
config::OptLevel::Aggressive => llvm::CodeGenLevelAggressive,
145-
_ => llvm::CodeGenLevelDefault,
141+
config::OptLevel::No => llvm::CodeGenOptLevel::None,
142+
config::OptLevel::Less => llvm::CodeGenOptLevel::Less,
143+
config::OptLevel::Default => llvm::CodeGenOptLevel::Default,
144+
config::OptLevel::Aggressive => llvm::CodeGenOptLevel::Aggressive,
145+
_ => llvm::CodeGenOptLevel::Default,
146146
}
147147
}
148148

@@ -169,11 +169,11 @@ pub fn create_target_machine(sess: &Session) -> TargetMachineRef {
169169
};
170170

171171
let code_model = match code_model_arg {
172-
"default" => llvm::CodeModelDefault,
173-
"small" => llvm::CodeModelSmall,
174-
"kernel" => llvm::CodeModelKernel,
175-
"medium" => llvm::CodeModelMedium,
176-
"large" => llvm::CodeModelLarge,
172+
"default" => llvm::CodeModel::Default,
173+
"small" => llvm::CodeModel::Small,
174+
"kernel" => llvm::CodeModel::Kernel,
175+
"medium" => llvm::CodeModel::Medium,
176+
"large" => llvm::CodeModel::Large,
177177
_ => {
178178
sess.err(&format!("{:?} is not a valid code model",
179179
sess.opts
@@ -449,9 +449,9 @@ unsafe fn optimize_and_codegen(cgcx: &CodegenContext,
449449
return false;
450450
}
451451
let pass_manager = match llvm::LLVMRustPassKind(pass) {
452-
llvm::SupportedPassKind::Function => fpm,
453-
llvm::SupportedPassKind::Module => mpm,
454-
llvm::SupportedPassKind::Unsupported => {
452+
llvm::PassKind::Function => fpm,
453+
llvm::PassKind::Module => mpm,
454+
llvm::PassKind::Other => {
455455
cgcx.handler.err("Encountered LLVM pass kind we can't handle");
456456
return true
457457
},
@@ -579,7 +579,7 @@ unsafe fn optimize_and_codegen(cgcx: &CodegenContext,
579579
};
580580
with_codegen(tm, llmod, config.no_builtins, |cpm| {
581581
write_output_file(cgcx.handler, tm, cpm, llmod, &path,
582-
llvm::AssemblyFileType);
582+
llvm::FileType::AssemblyFile);
583583
});
584584
if config.emit_obj {
585585
llvm::LLVMDisposeModule(llmod);
@@ -588,7 +588,8 @@ unsafe fn optimize_and_codegen(cgcx: &CodegenContext,
588588

589589
if write_obj {
590590
with_codegen(tm, llmod, config.no_builtins, |cpm| {
591-
write_output_file(cgcx.handler, tm, cpm, llmod, &obj_out, llvm::ObjectFileType);
591+
write_output_file(cgcx.handler, tm, cpm, llmod, &obj_out,
592+
llvm::FileType::ObjectFile);
592593
});
593594
}
594595
});
@@ -1078,7 +1079,7 @@ pub unsafe fn with_llvm_pmb(llmod: ModuleRef,
10781079
// reasonable defaults and prepare it to actually populate the pass
10791080
// manager.
10801081
let builder = llvm::LLVMPassManagerBuilderCreate();
1081-
let opt_level = config.opt_level.unwrap_or(llvm::CodeGenLevelNone);
1082+
let opt_level = config.opt_level.unwrap_or(llvm::CodeGenOptLevel::None);
10821083
let opt_size = config.opt_size.unwrap_or(llvm::CodeGenOptSizeNone);
10831084
let inline_threshold = config.inline_threshold;
10841085

@@ -1102,7 +1103,7 @@ pub unsafe fn with_llvm_pmb(llmod: ModuleRef,
11021103
(_, _, Some(t)) => {
11031104
llvm::LLVMPassManagerBuilderUseInlinerWithThreshold(builder, t as u32);
11041105
}
1105-
(llvm::CodeGenLevelAggressive, _, _) => {
1106+
(llvm::CodeGenOptLevel::Aggressive, _, _) => {
11061107
llvm::LLVMPassManagerBuilderUseInlinerWithThreshold(builder, 275);
11071108
}
11081109
(_, llvm::CodeGenOptSizeDefault, _) => {
@@ -1111,15 +1112,18 @@ pub unsafe fn with_llvm_pmb(llmod: ModuleRef,
11111112
(_, llvm::CodeGenOptSizeAggressive, _) => {
11121113
llvm::LLVMPassManagerBuilderUseInlinerWithThreshold(builder, 25);
11131114
}
1114-
(llvm::CodeGenLevelNone, _, _) => {
1115+
(llvm::CodeGenOptLevel::None, _, _) => {
11151116
llvm::LLVMRustAddAlwaysInlinePass(builder, false);
11161117
}
1117-
(llvm::CodeGenLevelLess, _, _) => {
1118+
(llvm::CodeGenOptLevel::Less, _, _) => {
11181119
llvm::LLVMRustAddAlwaysInlinePass(builder, true);
11191120
}
1120-
(llvm::CodeGenLevelDefault, _, _) => {
1121+
(llvm::CodeGenOptLevel::Default, _, _) => {
11211122
llvm::LLVMPassManagerBuilderUseInlinerWithThreshold(builder, 225);
11221123
}
1124+
(llvm::CodeGenOptLevel::Other, _, _) => {
1125+
bug!("CodeGenOptLevel::Other selected")
1126+
}
11231127
}
11241128

11251129
f(builder);

src/librustc_trans/context.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -325,10 +325,10 @@ pub fn get_reloc_model(sess: &Session) -> llvm::RelocMode {
325325
};
326326

327327
match reloc_model_arg {
328-
"pic" => llvm::RelocPIC,
329-
"static" => llvm::RelocStatic,
330-
"default" => llvm::RelocDefault,
331-
"dynamic-no-pic" => llvm::RelocDynamicNoPic,
328+
"pic" => llvm::RelocMode::PIC,
329+
"static" => llvm::RelocMode::Static,
330+
"default" => llvm::RelocMode::Default,
331+
"dynamic-no-pic" => llvm::RelocMode::DynamicNoPic,
332332
_ => {
333333
sess.err(&format!("{:?} is not a valid relocation mode",
334334
sess.opts
@@ -347,7 +347,7 @@ fn is_any_library(sess: &Session) -> bool {
347347
}
348348

349349
pub fn is_pie_binary(sess: &Session) -> bool {
350-
!is_any_library(sess) && get_reloc_model(sess) == llvm::RelocPIC
350+
!is_any_library(sess) && get_reloc_model(sess) == llvm::RelocMode::PIC
351351
}
352352

353353
unsafe fn create_context_and_module(sess: &Session, mod_name: &str) -> (ContextRef, ModuleRef) {

0 commit comments

Comments
 (0)