Skip to content

Commit 77f5540

Browse files
committed
Fix build now that llvm-sys 100.1 has been released. Even though our Cargo.toml specifies 100.0, this is considered stable per semver and cargo will pick the new one on its own, and they are not actually compatible.
Add support for creating namespaces, via DINamespace type and create_namespace method.
1 parent 6b2d251 commit 77f5540

File tree

2 files changed

+139
-92
lines changed

2 files changed

+139
-92
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ experimental = ["static-alloc"]
6767
either = "1.5"
6868
inkwell_internals = { path = "./internal_macros", version = "0.2.0" }
6969
libc = "0.2"
70-
llvm-sys = "100.0.1"
70+
llvm-sys = "100.1.0"
7171
once_cell = "1.2"
7272
parking_lot = "0.11"
7373
regex = "1"

src/debug_info.rs

Lines changed: 138 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
9090
use crate::basic_block::BasicBlock;
9191
use crate::context::Context;
92+
pub use crate::debug_info::flags::{DIFlags, DIFlagsConstants};
9293
use crate::module::Module;
9394
use crate::values::{AsValueRef, BasicValueEnum, InstructionValue, PointerValue};
9495
#[llvm_versions(8.0..=latest)]
@@ -103,9 +104,9 @@ use llvm_sys::debuginfo::{
103104
LLVMDIBuilderCreateAutoVariable, LLVMDIBuilderCreateBasicType, LLVMDIBuilderCreateCompileUnit,
104105
LLVMDIBuilderCreateDebugLocation, LLVMDIBuilderCreateExpression, LLVMDIBuilderCreateFile,
105106
LLVMDIBuilderCreateFunction, LLVMDIBuilderCreateLexicalBlock, LLVMDIBuilderCreateMemberType,
106-
LLVMDIBuilderCreateParameterVariable, LLVMDIBuilderCreateStructType,
107-
LLVMDIBuilderCreateSubroutineType, LLVMDIBuilderCreateUnionType, LLVMDIBuilderFinalize,
108-
LLVMDIBuilderInsertDbgValueBefore, LLVMDIBuilderInsertDeclareAtEnd,
107+
LLVMDIBuilderCreateNameSpace, LLVMDIBuilderCreateParameterVariable,
108+
LLVMDIBuilderCreateStructType, LLVMDIBuilderCreateSubroutineType, LLVMDIBuilderCreateUnionType,
109+
LLVMDIBuilderFinalize, LLVMDIBuilderInsertDbgValueBefore, LLVMDIBuilderInsertDeclareAtEnd,
109110
LLVMDIBuilderInsertDeclareBefore, LLVMDILocationGetColumn, LLVMDILocationGetLine,
110111
LLVMDILocationGetScope, LLVMDITypeGetAlignInBits, LLVMDITypeGetOffsetInBits,
111112
LLVMDITypeGetSizeInBits,
@@ -645,6 +646,27 @@ impl<'ctx> DebugInfoBuilder<'ctx> {
645646
}
646647
}
647648

649+
pub fn create_namespace(
650+
&self,
651+
scope: DIScope<'ctx>,
652+
name: &str,
653+
export_symbols: bool
654+
) -> DINamespace<'ctx> {
655+
let metadata_ref = unsafe {
656+
LLVMDIBuilderCreateNameSpace(
657+
self.builder,
658+
scope.metadata_ref,
659+
name.as_ptr() as _,
660+
name.len(),
661+
export_symbols as _
662+
)
663+
};
664+
DINamespace {
665+
metadata_ref,
666+
_marker: PhantomData,
667+
}
668+
}
669+
648670
/// Insert a variable declaration (`llvm.dbg.declare`) before a specified instruction.
649671
pub fn insert_declare_before_instruction(
650672
&self,
@@ -809,6 +831,22 @@ impl<'ctx> AsDIScope<'ctx> for DICompileUnit<'ctx> {
809831
}
810832
}
811833

834+
/// Namespace scope for debug info
835+
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
836+
pub struct DINamespace<'ctx> {
837+
pub(crate) metadata_ref: LLVMMetadataRef,
838+
_marker: PhantomData<&'ctx Context>,
839+
}
840+
841+
impl<'ctx> AsDIScope<'ctx> for DINamespace<'ctx> {
842+
fn as_debug_info_scope(self) -> DIScope<'ctx> {
843+
DIScope {
844+
metadata_ref: self.metadata_ref,
845+
_marker: PhantomData,
846+
}
847+
}
848+
}
849+
812850
/// Function body scope for debug info
813851
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
814852
pub struct DISubprogram<'ctx> {
@@ -999,95 +1037,104 @@ pub struct DIExpression<'ctx> {
9991037

10001038
pub use flags::*;
10011039
mod flags {
1002-
use llvm_sys::debuginfo::{LLVMDIFlags, LLVMDWARFEmissionKind, LLVMDWARFSourceLanguage};
1003-
1004-
/// Debug info flags. Corresponds to `LLVMDIFlags` enum from LLVM.
1005-
#[llvm_enum(LLVMDIFlags)]
1006-
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
1007-
pub enum DIFlags {
1008-
#[llvm_variant(LLVMDIFlagZero)]
1009-
Zero,
1010-
#[llvm_variant(LLVMDIFlagPrivate)]
1011-
Private,
1012-
#[llvm_variant(LLVMDIFlagProtected)]
1013-
Protected,
1014-
#[llvm_variant(LLVMDIFlagPublic)]
1015-
Public,
1016-
#[llvm_variant(LLVMDIFlagFwdDecl)]
1017-
FwdDecl,
1018-
#[llvm_variant(LLVMDIFlagAppleBlock)]
1019-
AppleBlock,
1020-
#[llvm_versions(7.0..=9.0)]
1021-
#[llvm_variant(LLVMDIFlagBlockByrefStruct)]
1022-
BlockByrefStruct,
1023-
#[llvm_variant(LLVMDIFlagVirtual)]
1024-
Virtual,
1025-
#[llvm_variant(LLVMDIFlagArtificial)]
1026-
Artificial,
1027-
#[llvm_variant(LLVMDIFlagExplicit)]
1028-
Explicit,
1029-
#[llvm_variant(LLVMDIFlagPrototyped)]
1030-
Prototyped,
1031-
#[llvm_variant(LLVMDIFlagObjcClassComplete)]
1032-
ObjcClassComplete,
1033-
#[llvm_variant(LLVMDIFlagObjectPointer)]
1034-
ObjectPointer,
1035-
#[llvm_variant(LLVMDIFlagVector)]
1036-
Vector,
1037-
#[llvm_variant(LLVMDIFlagStaticMember)]
1038-
StaticMember,
1039-
#[llvm_variant(LLVMDIFlagLValueReference)]
1040-
LValueReference,
1041-
#[llvm_variant(LLVMDIFlagRValueReference)]
1042-
RValueReference,
1043-
#[llvm_variant(LLVMDIFlagReserved)]
1044-
Reserved,
1045-
#[llvm_variant(LLVMDIFlagSingleInheritance)]
1046-
SingleInheritance,
1047-
#[llvm_variant(LLVMDIFlagMultipleInheritance)]
1048-
MultipleInheritance,
1049-
#[llvm_variant(LLVMDIFlagVirtualInheritance)]
1050-
VirtualInheritance,
1051-
#[llvm_variant(LLVMDIFlagIntroducedVirtual)]
1052-
IntroducedVirtual,
1053-
#[llvm_variant(LLVMDIFlagBitField)]
1054-
BitField,
1055-
#[llvm_variant(LLVMDIFlagNoReturn)]
1056-
NoReturn,
1057-
#[llvm_versions(7.0..=8.0)]
1058-
#[llvm_variant(LLVMDIFlagMainSubprogram)]
1059-
MainSubprogram,
1060-
#[llvm_variant(LLVMDIFlagTypePassByValue)]
1061-
TypePassByValue,
1062-
#[llvm_variant(LLVMDIFlagTypePassByReference)]
1063-
TypePassByReference,
1064-
#[llvm_versions(7.0)]
1065-
#[llvm_variant(LLVMDIFlagFixedEnum)]
1066-
FixedEnum,
1067-
#[llvm_versions(8.0..=latest)]
1068-
#[llvm_variant(LLVMDIFlagEnumClass)]
1069-
EnumClass,
1070-
#[llvm_variant(LLVMDIFlagThunk)]
1071-
Thunk,
1072-
#[llvm_versions(7.0..=8.0)]
1073-
#[llvm_variant(LLVMDIFlagTrivial)]
1074-
Trivial,
1075-
#[llvm_versions(9.0..=latest)]
1076-
#[llvm_variant(LLVMDIFlagNonTrivial)]
1077-
NonTrivial,
1078-
#[llvm_versions(10.0)]
1079-
#[llvm_variant(LLVMDIFlagReservedBit4)]
1080-
ReservedBit4,
1081-
#[llvm_versions(8.0..=latest)]
1082-
#[llvm_variant(LLVMDIFlagBigendian)]
1083-
BigEndian,
1084-
#[llvm_versions(8.0..=latest)]
1085-
#[llvm_variant(LLVMDIFlagLittleEndian)]
1086-
LittleEndian,
1087-
#[llvm_variant(LLVMDIFlagIndirectVirtualBase)]
1088-
IndirectVirtualBase,
1040+
use llvm_sys::debuginfo::{LLVMDWARFEmissionKind, LLVMDWARFSourceLanguage};
1041+
pub use llvm_sys::debuginfo::LLVMDIFlags as DIFlags;
1042+
1043+
pub trait DIFlagsConstants {
1044+
const ZERO: Self;
1045+
const PRIVATE: Self;
1046+
const PROTECTED: Self;
1047+
const PUBLIC: Self;
1048+
const FWD_DECL: Self;
1049+
const APPLE_BLOCK: Self;
1050+
//#[llvm_versions(7.0..=9.0)]
1051+
//const BLOCK_BYREF_STRUCT: Self;
1052+
const VIRTUAL: Self;
1053+
const ARTIFICIAL: Self;
1054+
const EXPLICIT: Self;
1055+
const PROTOTYPED: Self;
1056+
const OBJC_CLASS_COMPLETE: Self;
1057+
const OBJECT_POINTER: Self;
1058+
const VECTOR: Self;
1059+
const STATIC_MEMBER: Self;
1060+
const LVALUE_REFERENCE: Self;
1061+
const RVALUE_REFERENCE: Self;
1062+
const RESERVED: Self;
1063+
const SINGLE_INHERITANCE: Self;
1064+
const MULTIPLE_INHERITANCE: Self;
1065+
const VIRTUAL_INHERITANCE: Self;
1066+
const INTRODUCED_VIRTUAL: Self;
1067+
const BIT_FIELD: Self;
1068+
const NO_RETURN: Self;
1069+
//#[llvm_versions(7.0..=8.0)]
1070+
//const MAIN_SUBPROGRAM: Self;
1071+
const TYPE_PASS_BY_VALUE: Self;
1072+
const TYPE_PASS_BY_REFERENCE: Self;
1073+
//#[llvm_versions(7.0)]
1074+
//const FIXED_ENUM: Self;
1075+
//#[llvm_versions(8.0..=latest)]
1076+
//const ENUM_CLASS: Self;
1077+
const THUNK: Self;
1078+
//#[llvm_versions(7.0..=8.0)]
1079+
//const TRIVIAL: Self;
1080+
//#[llvm_versions(9.0..=latest)]
1081+
//const NON_TRIVIAL: Self;
1082+
//#[llvm_versions(10.0)]
1083+
//const RESERVED_BIT4: Self;
1084+
//#[llvm_versions(8.0..=latest)]
1085+
//const BIGE_NDIAN: Self;
1086+
//#[llvm_versions(8.0..=latest)]
1087+
//const LITTLE_ENDIAN: Self;
1088+
const INDIRECT_VIRTUAL_BASE: Self;
10891089
}
1090-
1090+
impl DIFlagsConstants for DIFlags {
1091+
const ZERO: DIFlags = llvm_sys::debuginfo::LLVMDIFlagZero;
1092+
const PRIVATE: DIFlags = llvm_sys::debuginfo::LLVMDIFlagPrivate;
1093+
const PROTECTED: DIFlags = llvm_sys::debuginfo::LLVMDIFlagProtected;
1094+
const PUBLIC: DIFlags = llvm_sys::debuginfo::LLVMDIFlagPublic;
1095+
const FWD_DECL: DIFlags = llvm_sys::debuginfo::LLVMDIFlagFwdDecl;
1096+
const APPLE_BLOCK: DIFlags = llvm_sys::debuginfo::LLVMDIFlagAppleBlock;
1097+
//#[llvm_versions(7.0..=9.0)]
1098+
//const BLOCK_BYREF_STRUCT: DIFlags = llvm_sys::debuginfo::LLVMDIFlagBlockByrefStruct;
1099+
const VIRTUAL: DIFlags = llvm_sys::debuginfo::LLVMDIFlagVirtual;
1100+
const ARTIFICIAL: DIFlags = llvm_sys::debuginfo::LLVMDIFlagArtificial;
1101+
const EXPLICIT: DIFlags = llvm_sys::debuginfo::LLVMDIFlagExplicit;
1102+
const PROTOTYPED: DIFlags = llvm_sys::debuginfo::LLVMDIFlagPrototyped;
1103+
const OBJC_CLASS_COMPLETE: DIFlags = llvm_sys::debuginfo::LLVMDIFlagObjcClassComplete;
1104+
const OBJECT_POINTER: DIFlags = llvm_sys::debuginfo::LLVMDIFlagObjectPointer;
1105+
const VECTOR: DIFlags = llvm_sys::debuginfo::LLVMDIFlagVector;
1106+
const STATIC_MEMBER: DIFlags = llvm_sys::debuginfo::LLVMDIFlagStaticMember;
1107+
const LVALUE_REFERENCE: DIFlags = llvm_sys::debuginfo::LLVMDIFlagLValueReference;
1108+
const RVALUE_REFERENCE: DIFlags = llvm_sys::debuginfo::LLVMDIFlagRValueReference;
1109+
const RESERVED: DIFlags = llvm_sys::debuginfo::LLVMDIFlagReserved;
1110+
const SINGLE_INHERITANCE: DIFlags = llvm_sys::debuginfo::LLVMDIFlagSingleInheritance;
1111+
const MULTIPLE_INHERITANCE: DIFlags = llvm_sys::debuginfo::LLVMDIFlagMultipleInheritance;
1112+
const VIRTUAL_INHERITANCE: DIFlags = llvm_sys::debuginfo::LLVMDIFlagVirtualInheritance;
1113+
const INTRODUCED_VIRTUAL: DIFlags = llvm_sys::debuginfo::LLVMDIFlagIntroducedVirtual;
1114+
const BIT_FIELD: DIFlags = llvm_sys::debuginfo::LLVMDIFlagBitField;
1115+
const NO_RETURN: DIFlags = llvm_sys::debuginfo::LLVMDIFlagNoReturn;
1116+
//#[llvm_versions(7.0..=8.0)]
1117+
//const MAIN_SUBPROGRAM: DIFlags = llvm_sys::debuginfo::LLVMDIFlagMainSubprogram;
1118+
const TYPE_PASS_BY_VALUE: DIFlags = llvm_sys::debuginfo::LLVMDIFlagTypePassByValue;
1119+
const TYPE_PASS_BY_REFERENCE: DIFlags = llvm_sys::debuginfo::LLVMDIFlagTypePassByReference;
1120+
//#[llvm_versions(7.0)]
1121+
//const FIXED_ENUM: DIFlags = llvm_sys::debuginfo::LLVMDIFlagFixedEnum;
1122+
//#[llvm_versions(8.0..=latest)]
1123+
//const ENUM_CLASS: DIFlags = llvm_sys::debuginfo::LLVMDIFlagEnumClass;
1124+
const THUNK: DIFlags = llvm_sys::debuginfo::LLVMDIFlagThunk;
1125+
//#[llvm_versions(7.0..=8.0)]
1126+
//const TRIVIAL: DIFlags = llvm_sys::debuginfo::LLVMDIFlagTrivial;
1127+
//#[llvm_versions(9.0..=latest)]
1128+
//const NON_TRIVIAL: DIFlags = llvm_sys::debuginfo::LLVMDIFlagNonTrivial;
1129+
//#[llvm_versions(10.0)]
1130+
//const RESERVED_BIT4: DIFlags = llvm_sys::debuginfo::LLVMDIFlagReservedBit4;
1131+
//#[llvm_versions(8.0..=latest)]
1132+
//const BIG_ENDIAN: DIFlags = llvm_sys::debuginfo::LLVMDIFlagBigEndian;
1133+
//#[llvm_versions(8.0..=latest)]
1134+
//const LITTLE_ENDIAN: DIFlags = llvm_sys::debuginfo::LLVMDIFlagLittleEndian;
1135+
const INDIRECT_VIRTUAL_BASE: DIFlags = llvm_sys::debuginfo::LLVMDIFlagIndirectVirtualBase;
1136+
}
1137+
10911138
/// The amount of debug information to emit. Corresponds to `LLVMDWARFEmissionKind` enum from LLVM.
10921139
#[llvm_enum(LLVMDWARFEmissionKind)]
10931140
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]

0 commit comments

Comments
 (0)