1
+ export DIBuilder, DIFile, DICompileUnit, DILexicalBlock, DISubprogram
2
+
3
+ @checked struct DIBuilder
4
+ ref:: API.LLVMDIBuilderRef
5
+ end
6
+
7
+ # LLVMCreateDIBuilderDisallowUnresolved
8
+ DIBuilder (mod:: Module ) = DIBuilder (API. LLVMCreateDIBuilder (mod))
9
+
10
+ dispose (builder:: DIBuilder ) = API. LLVMDisposeDIBuilder (builder)
11
+ finalize (builder:: DIBuilder ) = API. LLVMDIBuilderFinalize (builder)
12
+
13
+ Base. unsafe_convert (:: Type{API.LLVMDIBuilderRef} , builder:: DIBuilder ) = builder. ref
14
+
15
+ struct DIFile
16
+ file:: String
17
+ dir:: String
18
+ end
19
+
20
+ struct DICompileUnit
21
+ file:: Metadata
22
+ language:: API.LLVMDWARFSourceLanguage
23
+ producer:: String
24
+ sysroot:: String
25
+ sdk:: String
26
+ flags:: String
27
+ optimized:: Core.Bool
28
+ version:: Int
29
+ end
30
+
31
+ function compileunit! (builder:: DIBuilder , cu:: DICompileUnit )
32
+ md = API. LLVMDIBuilderCreateCompileUnit (
33
+ builder,
34
+ cu. language,
35
+ cu. file,
36
+ cu. producer, convert (Csize_t, length (cu. producer)),
37
+ cu. optimized ? LLVM. True : LLVM. False,
38
+ cu. flags, convert (Csize_t, length (cu. flags)),
39
+ convert (Cuint, cu. version),
40
+ #= SplitName=# C_NULL , 0 ,
41
+ API. LLVMDWARFEmissionFull,
42
+ #= DWOId=# 0 ,
43
+ #= SplitDebugInlining=# LLVM. True,
44
+ #= DebugInfoForProfiling=# LLVM. False,
45
+ cu. sysroot, convert (Csize_t, length (cu. sysroot)),
46
+ cu. sdk, convert (Csize_t, length (cu. sdk)),
47
+ )
48
+ return Metadata (md)
49
+ end
50
+
51
+ function file! (builder:: DIBuilder , file:: DIFile )
52
+ md = API. LLVMDIBuilderCreateFile (
53
+ builder,
54
+ file. file, convert (Csize_t, length (file. file)),
55
+ file. dir, convert (Csize_t, length (file. dir))
56
+ )
57
+ return Metadata (md)
58
+ end
59
+
60
+ struct DILexicalBlock
61
+ file:: Metadata
62
+ line:: Int
63
+ column:: Int
64
+ end
65
+
66
+ function lexicalblock! (builder:: DIBuilder , scope:: Metadata , block:: DILexicalBlock )
67
+ md = API. LLVMDIBuilderCreateLexicalBlock (
68
+ builder,
69
+ scope,
70
+ block. file,
71
+ convert (Cuint, block. line),
72
+ convert (Cuint, block. column)
73
+ )
74
+ Metadata (md)
75
+ end
76
+
77
+ function lexicalblock! (builder:: DIBuilder , scope:: Metadata , file:: Metadata , discriminator)
78
+ md = API. LLVMDIBuilderCreateLexicalBlockFile (
79
+ builder,
80
+ scope,
81
+ file,
82
+ convert (Cuint, discriminator)
83
+ )
84
+ Metadata (md)
85
+ end
86
+
87
+ struct DISubprogram
88
+ name:: String
89
+ linkageName:: String
90
+ file:: Metadata
91
+ line:: Int
92
+ type:: Metadata
93
+ localToUnit:: Core.Bool
94
+ isDefinition:: Core.Bool
95
+ scopeLine:: Int
96
+ flags:: LLVM.API.LLVMDIFlags
97
+ optimized:: Core.Bool
98
+ end
99
+
100
+ function subprogram! (builder:: DIBuilder , f:: DISubprogram )
101
+ md = API. LLVMDIBuilderCreateFunction (
102
+ builder,
103
+ f. file,
104
+ f. name, convert (Csize_t, length (f. name)),
105
+ f. linkageName, convert (Csize_t, length (f. linkageName)),
106
+ f. file,
107
+ f. line,
108
+ f. type,
109
+ f. localToUnit ? LLVM. True : LLVM. False,
110
+ f. isDefinition ? LLVM. True : LLVM. False,
111
+ convert (Cuint, f. scopeLine),
112
+ f. flags,
113
+ f. optimized ? LLVM. True : LLVM. False
114
+ )
115
+ Metadata (md)
116
+ end
117
+
118
+ # TODO : Variables
119
+
120
+ function basictype! (builder:: DIBuilder , name, size, encoding)
121
+ md = LLVM. API. LLVMDIBuilderCreateBasicType (
122
+ builder,
123
+ name, convert (Csize_t, length (name)),
124
+ convert (UInt64, size),
125
+ encoding,
126
+ LLVM. API. LLVMDIFlagZero
127
+ )
128
+ Metadata (md)
129
+ end
130
+
131
+ function pointertype! (builder:: DIBuilder , basetype:: Metadata , size, as, align= 0 , name= " " )
132
+ md = LLVM. API. LLVMDIBuilderCreatePointerType (
133
+ builder,
134
+ basetype,
135
+ convert (UInt64, size),
136
+ convert (UInt32, align),
137
+ convert (Cuint, as),
138
+ name, convert (Csize_t, length (name)),
139
+ )
140
+ Metadata (md)
141
+ end
142
+
143
+ function subroutinetype! (builder:: DIBuilder , file:: Metadata , rettype, paramtypes... )
144
+ params = collect (x for x in (rettype, paramtypes... ))
145
+ md = LLVM. API. LLVMDIBuilderCreateSubroutineType (
146
+ builder,
147
+ file,
148
+ params,
149
+ length (params),
150
+ LLVM. API. LLVMDIFlagZero
151
+ )
152
+ Metadata (md)
153
+ end
154
+
1
155
function DILocation (ctx, line, col, scope= nothing , inlined_at= nothing )
2
156
# XXX : are null scopes valid? they crash LLVM:
3
157
# DILocation(Context(), 1, 2).scope
4
158
DILocation (API. LLVMDIBuilderCreateDebugLocation (ctx, line, col,
5
159
something (scope, C_NULL ),
6
160
something (inlined_at, C_NULL )))
7
161
end
162
+
163
+ # TODO : Types
0 commit comments