Skip to content

Commit ed9a4cb

Browse files
committed
fixup! support for DIBuilder on LLVM8
1 parent 8df75a7 commit ed9a4cb

File tree

4 files changed

+58
-37
lines changed

4 files changed

+58
-37
lines changed

src/LLVM.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ include("ir.jl")
4343
include("bitcode.jl")
4444
include("transform.jl")
4545
include("debuginfo.jl")
46-
if libllvm_version >= v"8.0.0"
46+
if Base.libllvm_version >= v"8.0.0"
4747
include("dibuilder.jl")
4848
end
4949

src/dibuilder.jl

+37-29
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,38 @@
1-
export DIBuilder, DICompileUnit, DILexicalBlock, DIFunction
1+
export DIBuilder, DIFile, DICompileUnit, DILexicalBlock, DIFunction
22

33
@checked struct DIBuilder
44
ref::API.LLVMDIBuilderRef
55
end
6-
reftype(::Type{DIBuilder}) = API.DILLVMDIBuilderRef
76

87
# LLVMCreateDIBuilderDisallowUnresolved
9-
DIBuilder(mod::Module) = DIBuilder(API.LLVMCreateDIBuilder(ref(mod)))
8+
DIBuilder(mod::Module) = DIBuilder(API.LLVMCreateDIBuilder(mod))
109

11-
dispose(builder::DIBuilder) = API.LLVMDisposeDIBuilder(ref(builder))
12-
finalize(builder::DIBuilder) = API.LLVMDIBuilderFinalize(ref(builder))
10+
dispose(builder::DIBuilder) = API.LLVMDisposeDIBuilder(builder)
11+
finalize(builder::DIBuilder) = API.LLVMDIBuilderFinalize(builder)
1312

14-
struct DICompileUnit
13+
Base.unsafe_convert(::Type{API.LLVMDIBuilderRef}, builder::DIBuilder) = builder.ref
14+
15+
struct DIFile
1516
file::String
1617
dir::String
18+
end
19+
20+
struct DICompileUnit
21+
file::Metadata
1722
language::API.LLVMDWARFSourceLanguage
1823
producer::String
24+
sysroot::String
25+
sdk::String
1926
flags::String
2027
optimized::Core.Bool
2128
version::Int
2229
end
2330

2431
function compileunit!(builder::DIBuilder, cu::DICompileUnit)
25-
file = file!(builder, cu.file, cu.dir)
2632
md = API.LLVMDIBuilderCreateCompileUnit(
27-
ref(builder),
33+
builder,
2834
cu.language,
29-
ref(file),
35+
cu.file,
3036
cu.producer, convert(Csize_t, length(cu.producer)),
3137
cu.optimized ? LLVM.True : LLVM.False,
3238
cu.flags, convert(Csize_t, length(cu.flags)),
@@ -36,15 +42,17 @@ function compileunit!(builder::DIBuilder, cu::DICompileUnit)
3642
#=DWOId=# 0,
3743
#=SplitDebugInlining=# LLVM.True,
3844
#=DebugInfoForProfiling=# LLVM.False,
45+
cu.sysroot, convert(Csize_t, length(cu.sysroot)),
46+
cu.sdk, convert(Csize_t, length(cu.sdk)),
3947
)
4048
return Metadata(md)
4149
end
4250

43-
function file!(builder::DIBuilder, filename, directory)
51+
function file!(builder::DIBuilder, file::DIFile)
4452
md = API.LLVMDIBuilderCreateFile(
45-
ref(builder),
46-
filename, convert(Csize_t, length(filename)),
47-
directory, convert(Csize_t, length(directory))
53+
builder,
54+
file.file, convert(Csize_t, length(file.file)),
55+
file.dir, convert(Csize_t, length(file.dir))
4856
)
4957
return Metadata(md)
5058
end
@@ -56,10 +64,10 @@ struct DILexicalBlock
5664
end
5765

5866
function lexicalblock!(builder::DIBuilder, scope::Metadata, block::DILexicalBlock)
59-
md = API.LLVMDIBuilerCreateLexicalBlock(
60-
ref(builder),
61-
ref(scope),
62-
ref(block.file),
67+
md = API.LLVMDIBuilderCreateLexicalBlock(
68+
builder,
69+
scope,
70+
block.file,
6371
convert(Cuint, block.line),
6472
convert(Cuint, block.column)
6573
)
@@ -68,9 +76,9 @@ end
6876

6977
function lexicalblock!(builder::DIBuilder, scope::Metadata, file::Metadata, discriminator)
7078
md = API.LLVMDIBuilderCreateLexicalBlockFile(
71-
ref(builder),
72-
ref(scope),
73-
ref(file),
79+
builder,
80+
scope,
81+
file,
7482
convert(Cuint, discriminator)
7583
)
7684
Metadata(md)
@@ -91,13 +99,13 @@ end
9199

92100
function subprogram!(builder::DIBuilder, scope::Metadata, f::DIFunction)
93101
md = API.LLVMDIBuilderCreateFunction(
94-
ref(builder),
95-
ref(scope),
102+
builder,
103+
scope,
96104
f.name, convert(Csize_t, length(f.name)),
97105
f.linkageName, convert(Csize_t, length(f.linkageName)),
98-
ref(f.file),
106+
f.file,
99107
f.line,
100-
ref(f.type),
108+
f.type,
101109
f.localToUnit ? LLVM.True : LLVM.False,
102110
f.isDefinition ? LLVM.True : LLVM.False,
103111
convert(Cuint, f.scopeLine),
@@ -111,7 +119,7 @@ end
111119

112120
function basictype!(builder::DIBuilder, name, size, encoding)
113121
md = LLVM.API.LLVMDIBuilderCreateBasicType(
114-
ref(builder),
122+
builder,
115123
name,
116124
convert(Csize_t, length(name)),
117125
convert(UInt64, size),
@@ -123,8 +131,8 @@ end
123131

124132
function pointertype!(builder::DIBuilder, pointee::Metadata, size, as, align=0, name="")
125133
md = LLVM.API.LLVMDIBuilderCreatePointerType(
126-
ref(builder),
127-
ref(pointee),
134+
builder,
135+
pointee,
128136
convert(UInt64, size),
129137
convert(UInt32, align),
130138
convert(Cuint, as),
@@ -137,8 +145,8 @@ end
137145
function subroutinetype!(builder::DIBuilder, file::Metadata, rettype, paramtypes...)
138146
params = collect(ref(x) for x in (rettype, paramtypes...))
139147
md = LLVM.API.LLVMDIBuilderCreateSubroutineType(
140-
ref(builder),
141-
ref(file),
148+
builder,
149+
file,
142150
params,
143151
length(params),
144152
LLVM.API.LLVMDIFlagZero

test/dibuilder.jl

+18-5
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ end
1010
Context() do ctx
1111
LLVM.Module("SomeModule", ctx) do mod
1212
dibuilder = DIBuilder(mod)
13-
file = LLVM.file!(dibuilder, "test.jl", "src")
14-
cu = LLVM.compileunit!(dibuilder, LLVM.API.LLVMDWARFSourceLanguageJulia, file, "LLVM.jl Tests", LLVM.False,
15-
"", UInt32(0), "", LLVM.API.LLVMDWARFEmissionFull, UInt32(4), LLVM.False, LLVM.False)
13+
file = DIFile("test.jl", "src")
14+
file_md = LLVM.file!(dibuilder, file)
15+
cu = DICompileUnit(file_md, LLVM.API.LLVMDWARFSourceLanguageJulia, "LLVM.jl Tests", "/", "LLVM.jl", "", false, 4)
16+
cu_md = LLVM.compileunit!(dibuilder, cu)
1617

1718
Builder(ctx) do builder
1819
ft = LLVM.FunctionType(LLVM.VoidType(ctx), [LLVM.Int32Type(ctx)])
@@ -21,8 +22,9 @@ LLVM.Module("SomeModule", ctx) do mod
2122
entrybb = BasicBlock(fn, "entry")
2223
position!(builder, entrybb)
2324

24-
md = LLVM.location!(ctx, UInt32(1), UInt32(1), cu) # could also be file
25-
debuglocation!(builder, LLVM.MetadataAsValue(LLVM.API.LLVMMetadataAsValue(LLVM.ref(ctx), md)))
25+
block = DILexicalBlock(file_md, 1, 1)
26+
block_md = LLVM.lexicalblock!(dibuilder, file_md, block) # could also be file
27+
debuglocation!(builder, LLVM.MetadataAsValue(LLVM.API.LLVMMetadataAsValue(ctx, block_md)))
2628
ret!(builder)
2729
end
2830

@@ -32,8 +34,19 @@ LLVM.Module("SomeModule", ctx) do mod
3234
fun = functions(mod)["SomeFunction"]
3335
bb = entry(fun)
3436
inst = first(instructions(bb))
37+
@test !isempty(metadata(inst))
38+
inst_str = sprint(io->Base.show(io, inst))
39+
@test occursin("!dbg", inst_str)
40+
@show mod inst
3541

3642
@test !isempty(metadata(inst))
43+
mod_str = sprint(io->Base.show(io, mod))
44+
@test occursin("!llvm.dbg.cu", mod_str)
45+
@test occursin("!DICompileUnit", mod_str)
46+
@test occursin("!DIFile", mod_str)
47+
@test occursin("!DILexicalBlock", mod_str)
48+
@test !occursin("scope: null", mod_str)
49+
3750
strip_debuginfo!(mod)
3851
@test isempty(metadata(inst))
3952
end

test/runtests.jl

+2-2
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,11 @@ end
6363
if LLVM.version() >= v"8.0.0"
6464
include("dibuilder.jl")
6565
end
66-
66+
#=
6767
include("Kaleidoscope.jl")
6868
6969
include("examples.jl")
7070
7171
include("interop.jl")
72-
72+
=#
7373
end

0 commit comments

Comments
 (0)