Skip to content

Commit 0870807

Browse files
committed
Add wrappers for DebugInfo.h
1 parent a127967 commit 0870807

File tree

5 files changed

+523
-0
lines changed

5 files changed

+523
-0
lines changed

Sources/LLVM/DIBuilder.swift

Lines changed: 389 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,389 @@
1+
#if SWIFT_PACKAGE
2+
import cllvm
3+
#endif
4+
5+
/// Source languages known by DWARF.
6+
public enum DWARFSourceLanguage {
7+
case ada83
8+
9+
case ada95
10+
11+
case c
12+
13+
case c89
14+
15+
case c99
16+
17+
case c11
18+
19+
case cPlusPlus
20+
21+
case cPlusPlus03
22+
23+
case cPlusPlus11
24+
25+
case cPlusPlus14
26+
27+
case cobol74
28+
29+
case cobol85
30+
31+
case fortran77
32+
33+
case fortran90
34+
35+
case fortran03
36+
37+
case fortran08
38+
39+
case pascal83
40+
41+
case modula2
42+
43+
case java
44+
45+
case fortran95
46+
47+
case PLI
48+
49+
case objC
50+
51+
case objCPlusPlus
52+
53+
case UPC
54+
55+
case D
56+
57+
case python
58+
59+
case openCL
60+
61+
case go
62+
63+
case modula3
64+
65+
case haskell
66+
67+
case ocaml
68+
69+
case rust
70+
71+
case swift
72+
73+
case julia
74+
75+
case dylan
76+
77+
case renderScript
78+
79+
case BLISS
80+
81+
// MARK: Vendor Extensions
82+
83+
case mipsAssembler
84+
85+
case googleRenderScript
86+
87+
case borlandDelphi
88+
89+
90+
private static let languageMapping: [DWARFSourceLanguage: LLVMDWARFSourceLanguage] = [
91+
.c: LLVMDWARFSourceLanguageC, .c89: LLVMDWARFSourceLanguageC89,
92+
.c99: LLVMDWARFSourceLanguageC99, .c11: LLVMDWARFSourceLanguageC11,
93+
.ada83: LLVMDWARFSourceLanguageAda83,
94+
.cPlusPlus: LLVMDWARFSourceLanguageC_plus_plus,
95+
.cPlusPlus03: LLVMDWARFSourceLanguageC_plus_plus_03,
96+
.cPlusPlus11: LLVMDWARFSourceLanguageC_plus_plus_11,
97+
.cPlusPlus14: LLVMDWARFSourceLanguageC_plus_plus_14,
98+
.cobol74: LLVMDWARFSourceLanguageCobol74,
99+
.cobol85: LLVMDWARFSourceLanguageCobol85,
100+
.fortran77: LLVMDWARFSourceLanguageFortran77,
101+
.fortran90: LLVMDWARFSourceLanguageFortran90,
102+
.pascal83: LLVMDWARFSourceLanguagePascal83,
103+
.modula2: LLVMDWARFSourceLanguageModula2,
104+
.java: LLVMDWARFSourceLanguageJava,
105+
.ada95: LLVMDWARFSourceLanguageAda95,
106+
.fortran95: LLVMDWARFSourceLanguageFortran95,
107+
.PLI: LLVMDWARFSourceLanguagePLI,
108+
.objC: LLVMDWARFSourceLanguageObjC,
109+
.objCPlusPlus: LLVMDWARFSourceLanguageObjC_plus_plus,
110+
.UPC: LLVMDWARFSourceLanguageUPC,
111+
.D: LLVMDWARFSourceLanguageD,
112+
.python: LLVMDWARFSourceLanguagePython,
113+
.openCL: LLVMDWARFSourceLanguageOpenCL,
114+
.go: LLVMDWARFSourceLanguageGo,
115+
.modula3: LLVMDWARFSourceLanguageModula3,
116+
.haskell: LLVMDWARFSourceLanguageHaskell,
117+
.ocaml: LLVMDWARFSourceLanguageOCaml,
118+
.rust: LLVMDWARFSourceLanguageRust,
119+
.swift: LLVMDWARFSourceLanguageSwift,
120+
.julia: LLVMDWARFSourceLanguageJulia,
121+
.dylan: LLVMDWARFSourceLanguageDylan,
122+
.fortran03: LLVMDWARFSourceLanguageFortran03,
123+
.fortran08: LLVMDWARFSourceLanguageFortran08,
124+
.renderScript: LLVMDWARFSourceLanguageRenderScript,
125+
.BLISS: LLVMDWARFSourceLanguageBLISS,
126+
.mipsAssembler: LLVMDWARFSourceLanguageMips_Assembler,
127+
.googleRenderScript: LLVMDWARFSourceLanguageGOOGLE_RenderScript,
128+
.borlandDelphi: LLVMDWARFSourceLanguageBORLAND_Delphi,
129+
]
130+
131+
/// Retrieves the corresponding `LLVMDWARFSourceLanguage`.
132+
public var llvm: LLVMDWARFSourceLanguage {
133+
return DWARFSourceLanguage.languageMapping[self]!
134+
}
135+
}
136+
137+
/// Qualifiers for types, e.g. \c const.
138+
public enum DWARFTypeQualifier {
139+
case null
140+
141+
case array
142+
143+
case `class`
144+
145+
case entryPoint
146+
147+
case enumeration
148+
149+
case formalParameter
150+
151+
case importedDeclaration
152+
153+
case label
154+
155+
case lexicalBlock
156+
157+
case member
158+
159+
case pointer
160+
161+
case reference
162+
163+
case compileUnit
164+
165+
case string
166+
167+
case structure
168+
169+
case subroutine
170+
171+
case typedef
172+
173+
case union
174+
175+
case unspecifiedParameters
176+
177+
case variant
178+
179+
case commonBlock
180+
181+
case commonInclusion
182+
183+
case inheritance
184+
185+
case inlinedSubroutine
186+
187+
case module
188+
189+
case pointerToMember
190+
191+
case set
192+
193+
case subrange
194+
195+
case withStatement
196+
197+
case accessDeclaration
198+
199+
case base
200+
201+
case `catch`
202+
203+
case const
204+
205+
case constant
206+
207+
case enumerator
208+
209+
case file
210+
211+
case friend
212+
213+
case namelist
214+
215+
case namelistItem
216+
217+
case packed
218+
219+
case subprogram
220+
221+
case templateTypeParameter
222+
223+
case templateValueParameter
224+
225+
case thrown
226+
227+
case tryBlock
228+
229+
case variantPart
230+
231+
case variable
232+
233+
case volatileType
234+
235+
// New in DWARF v3:
236+
case dwarfProcedure
237+
238+
case restrict
239+
240+
case interface
241+
242+
case namespace
243+
244+
case importedModule
245+
246+
case unspecified
247+
248+
case partialUnit
249+
250+
case importedUnit
251+
252+
case condition
253+
254+
case shared
255+
256+
case typeUnit
257+
258+
case rvalueReference
259+
260+
case templateAlias
261+
262+
case coarray
263+
264+
case genericSubrange
265+
266+
case dynamic
267+
268+
case atomic
269+
270+
case callSite
271+
272+
case callSiteParameter
273+
274+
case skeletonUnit
275+
276+
case immutable
277+
278+
// MARK: Vendor extensions
279+
280+
case mipsLoop
281+
282+
case formatLabel
283+
284+
case functionTemplate
285+
286+
case classTemplate
287+
288+
case gnuTemplateTemplateParameter
289+
290+
case gnuTemplateParameterPack
291+
292+
case gnuFormalParameterPack
293+
294+
case appleProperty
295+
296+
case borlandProperty
297+
298+
case borlandDelphiString
299+
300+
case borlandDelphiDynamicArray
301+
302+
case borlandDelphiSet
303+
304+
case borlandDelphiVariant
305+
}
306+
307+
/// The amount of debug information to emit.
308+
public enum DWARFEmissionKind {
309+
case none
310+
case full
311+
case lineTablesOnly
312+
313+
private static let emissionMapping: [DWARFEmissionKind: LLVMDWARFEmissionKind] = [
314+
.none: LLVMDWARFEmissionNone, .full: LLVMDWARFEmissionFull,
315+
.lineTablesOnly: LLVMDWARFEmissionLineTablesOnly,
316+
]
317+
318+
/// Retrieves the corresponding `LLVMDWARFEmissionKind`.
319+
public var llvm: LLVMDWARFEmissionKind {
320+
return DWARFEmissionKind.emissionMapping[self]!
321+
}
322+
}
323+
324+
public final class DIBuilder {
325+
internal let llvm: LLVMDIBuilderRef
326+
327+
/// The module this `IRBuilder` is associated with.
328+
public let module: Module
329+
330+
public init(module: Module, allowUnresolved: Bool = false) {
331+
self.module = module
332+
if allowUnresolved {
333+
self.llvm = LLVMCreateDIBuilder(module.llvm)
334+
} else {
335+
self.llvm = LLVMCreateDIBuilderDisallowUnresolved(module.llvm)
336+
}
337+
}
338+
339+
/// A CompileUnit provides an anchor for all debugging
340+
/// information generated during this instance of compilation.
341+
// FIXME: DWOId
342+
public func createCompileUnit(
343+
for lang: DWARFSourceLanguage,
344+
in file: FileMetadata,
345+
identity: String = "",
346+
flags: [String],
347+
splitName: String = "",
348+
kind: DWARFEmissionKind,
349+
DWOId: UInt32 = 0,
350+
optimized: Bool = false,
351+
splitDebugInlining: Bool = false,
352+
debugInfoForProfiling: Bool = false
353+
) -> Scope {
354+
let allFlags = flags.joined(separator: " ")
355+
guard let cu = LLVMDIBuilderCreateCompileUnit(
356+
self.llvm, lang.llvm, file.llvm, identity, identity.count,
357+
optimized.llvm,
358+
allFlags, allFlags.count,
359+
/*Runtime Version*/0,
360+
splitName, splitName.count,
361+
kind.llvm, DWOId,
362+
splitDebugInlining.llvm,
363+
debugInfoForProfiling.llvm
364+
) else {
365+
fatalError()
366+
}
367+
return Scope(llvm: cu)
368+
}
369+
370+
/// Creates a new DebugLocation that describes a source location.
371+
public func createDebugLocation(at loc : (line: Int, column: Int), in scope: Scope, inlinedAt: Scope? = nil) -> DebugLocation {
372+
guard let loc = LLVMDIBuilderCreateDebugLocation(
373+
self.module.context.llvm, UInt32(loc.line), UInt32(loc.column),
374+
scope.llvm, inlinedAt?.llvm
375+
) else {
376+
fatalError("Failed to allocate metadata for a debug location")
377+
}
378+
return DebugLocation(llvm: loc)
379+
}
380+
381+
/// Construct any deferred debug info descriptors.
382+
public func finalize() {
383+
LLVMDIBuilderFinalize(self.llvm)
384+
}
385+
386+
deinit {
387+
LLVMDisposeDIBuilder(self.llvm)
388+
}
389+
}

0 commit comments

Comments
 (0)