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+
1155function DILocation (ctx, line, col, scope= nothing , inlined_at= nothing )
2156 # XXX : are null scopes valid? they crash LLVM:
3157 # DILocation(Context(), 1, 2).scope
4158 DILocation (API. LLVMDIBuilderCreateDebugLocation (ctx, line, col,
5159 something (scope, C_NULL ),
6160 something (inlined_at, C_NULL )))
7161end
162+
163+ # TODO : Types
0 commit comments