Skip to content

Commit a82c156

Browse files
authored
Merge pull request #164 from CodaFi/express-yourself
Import the Entire DWARF Expression Language
2 parents 90d8858 + 439fc3c commit a82c156

File tree

4 files changed

+1169
-0
lines changed

4 files changed

+1169
-0
lines changed

Sources/LLVM/DIBuilder.swift

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,3 +1055,77 @@ extension DIBuilder {
10551055
return ObjectiveCPropertyMetadata(llvm: ty)
10561056
}
10571057
}
1058+
1059+
extension DIBuilder {
1060+
/// Create a new descriptor for the specified variable which has a complex
1061+
/// address expression for its address.
1062+
///
1063+
/// - Parameters:
1064+
/// - expression: An array of complex address operations.
1065+
public func buildExpression(_ expression: [DWARFExpression]) -> ExpressionMetadata {
1066+
var expr = expression.flatMap { $0.rawValue }
1067+
let count = expr.count
1068+
return expr.withUnsafeMutableBytes { raw in
1069+
let rawVal = raw.bindMemory(to: Int64.self)
1070+
guard let expr = LLVMDIBuilderCreateExpression(
1071+
self.llvm, rawVal.baseAddress!, count)
1072+
else {
1073+
fatalError("Failed to allocate metadata")
1074+
}
1075+
return ExpressionMetadata(llvm: expr)
1076+
}
1077+
}
1078+
1079+
/// Create a new descriptor for the specified variable that does not have an
1080+
/// address, but does have a constant value.
1081+
///
1082+
/// - Parameters:
1083+
/// - value: The constant value.
1084+
public func buildConstantExpresion(_ value: Int) -> ExpressionMetadata {
1085+
guard let expr = LLVMDIBuilderCreateConstantValueExpression(
1086+
self.llvm, Int64(value))
1087+
else {
1088+
fatalError("Failed to allocate metadata")
1089+
}
1090+
return ExpressionMetadata(llvm: expr)
1091+
}
1092+
1093+
/// Create a new descriptor for the specified variable.
1094+
///
1095+
/// - Parameters:
1096+
/// - name: Name of the variable.
1097+
/// - linkageName: Mangled name of the variable.
1098+
/// - type: Variable Type.
1099+
/// - scope: Variable scope.
1100+
/// - file: File where this variable is defined.
1101+
/// - line: Line number.
1102+
/// - isLocal: Boolean flag indicate whether this variable is
1103+
/// externally visible or not.
1104+
/// - expression: The location of the global relative to the attached
1105+
/// GlobalVariable.
1106+
/// - declaration: Reference to the corresponding declaration.
1107+
/// - alignment: Variable alignment(or 0 if no alignment attr was
1108+
/// specified)
1109+
public func buildGlobalExpression(
1110+
named name: String, linkageName: String, type: DIType,
1111+
scope: DIScope, file: FileMetadata, line: Int,
1112+
isLocal: Bool = true,
1113+
expression: ExpressionMetadata? = nil,
1114+
declaration: Metadata? = nil,
1115+
alignment: Alignment = .zero
1116+
) -> ExpressionMetadata {
1117+
let radix = UInt32(self.module.dataLayout.intPointerType().width)
1118+
guard let ty = LLVMDIBuilderCreateGlobalVariableExpression(
1119+
self.llvm, scope.asMetadata(),
1120+
name, name.count, linkageName, linkageName.count,
1121+
file.asMetadata(), UInt32(line),
1122+
type.asMetadata(),
1123+
isLocal.llvm,
1124+
expression?.asMetadata(), declaration?.asMetadata(),
1125+
alignment.rawValue * radix)
1126+
else {
1127+
fatalError("Failed to allocate metadata")
1128+
}
1129+
return ExpressionMetadata(llvm: ty)
1130+
}
1131+
}

0 commit comments

Comments
 (0)