Skip to content

Commit 3254815

Browse files
committed
Made llvm-debuginfo-analyzer work for AMDGPU. A few changes to generate DWARF correctly in AMDGPU
1 parent 57d2d89 commit 3254815

File tree

7 files changed

+127
-11
lines changed

7 files changed

+127
-11
lines changed

llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,8 @@ class LVBinaryReader : public LVReader {
159159
LVAddress WasmCodeSectionOffset = 0;
160160

161161
// Loads all info for the architecture of the provided object file.
162-
Error loadGenericTargetInfo(StringRef TheTriple, StringRef TheFeatures);
162+
Error loadGenericTargetInfo(StringRef TheTriple, StringRef TheFeatures,
163+
StringRef CPU);
163164

164165
virtual void mapRangeAddress(const object::ObjectFile &Obj) {}
165166
virtual void mapRangeAddress(const object::ObjectFile &Obj,

llvm/lib/DebugInfo/LogicalView/Readers/LVBinaryReader.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,8 @@ void LVBinaryReader::mapVirtualAddress(const object::COFFObjectFile &COFFObj) {
275275
}
276276

277277
Error LVBinaryReader::loadGenericTargetInfo(StringRef TheTriple,
278-
StringRef TheFeatures) {
278+
StringRef TheFeatures,
279+
StringRef CPU) {
279280
std::string TargetLookupError;
280281
const Target *TheTarget =
281282
TargetRegistry::lookupTarget(TheTriple, TargetLookupError);
@@ -298,7 +299,6 @@ Error LVBinaryReader::loadGenericTargetInfo(StringRef TheTriple,
298299
MAI.reset(AsmInfo);
299300

300301
// Target subtargets.
301-
StringRef CPU;
302302
MCSubtargetInfo *SubtargetInfo(
303303
TheTarget->createMCSubtargetInfo(TheTriple, CPU, TheFeatures));
304304
if (!SubtargetInfo)

llvm/lib/DebugInfo/LogicalView/Readers/LVCodeViewReader.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,7 +1190,12 @@ Error LVCodeViewReader::loadTargetInfo(const ObjectFile &Obj) {
11901190
FeaturesValue = SubtargetFeatures();
11911191
}
11921192
FeaturesValue = *Features;
1193-
return loadGenericTargetInfo(TT.str(), FeaturesValue.getString());
1193+
1194+
StringRef CPU;
1195+
if (auto OptCPU = Obj.tryGetCPUName())
1196+
CPU = *OptCPU;
1197+
1198+
return loadGenericTargetInfo(TT.str(), FeaturesValue.getString(), CPU);
11941199
}
11951200

11961201
Error LVCodeViewReader::loadTargetInfo(const PDBFile &Pdb) {
@@ -1200,8 +1205,9 @@ Error LVCodeViewReader::loadTargetInfo(const PDBFile &Pdb) {
12001205
TT.setOS(Triple::Win32);
12011206

12021207
StringRef TheFeature = "";
1208+
StringRef TheCPU = "";
12031209

1204-
return loadGenericTargetInfo(TT.str(), TheFeature);
1210+
return loadGenericTargetInfo(TT.str(), TheFeature, TheCPU);
12051211
}
12061212

12071213
std::string LVCodeViewReader::getRegisterName(LVSmall Opcode,

llvm/lib/DebugInfo/LogicalView/Readers/LVDWARFReader.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -956,10 +956,7 @@ LVElement *LVDWARFReader::getElementForOffset(LVOffset Offset,
956956
Error LVDWARFReader::loadTargetInfo(const ObjectFile &Obj) {
957957
// Detect the architecture from the object file. We usually don't need OS
958958
// info to lookup a target and create register info.
959-
Triple TT;
960-
TT.setArch(Triple::ArchType(Obj.getArch()));
961-
TT.setVendor(Triple::UnknownVendor);
962-
TT.setOS(Triple::UnknownOS);
959+
Triple TT = Obj.makeTriple();
963960

964961
// Features to be passed to target/subtarget
965962
Expected<SubtargetFeatures> Features = Obj.getFeatures();
@@ -969,7 +966,12 @@ Error LVDWARFReader::loadTargetInfo(const ObjectFile &Obj) {
969966
FeaturesValue = SubtargetFeatures();
970967
}
971968
FeaturesValue = *Features;
972-
return loadGenericTargetInfo(TT.str(), FeaturesValue.getString());
969+
970+
StringRef CPU;
971+
if (auto OptCPU = Obj.tryGetCPUName())
972+
CPU = *OptCPU;
973+
974+
return loadGenericTargetInfo(TT.str(), FeaturesValue.getString(), CPU);
973975
}
974976

975977
void LVDWARFReader::mapRangeAddress(const ObjectFile &Obj) {

llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUAsmBackend.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,8 @@ class ELFAMDGPUAsmBackend : public AMDGPUAsmBackend {
226226
public:
227227
ELFAMDGPUAsmBackend(const Target &T, const Triple &TT)
228228
: AMDGPUAsmBackend(T), Is64Bit(TT.isAMDGCN()),
229-
HasRelocationAddend(TT.getOS() == Triple::AMDHSA) {
229+
HasRelocationAddend(TT.getOS() == Triple::AMDHSA ||
230+
TT.getOS() == Triple::AMDPAL) {
230231
switch (TT.getOS()) {
231232
case Triple::AMDHSA:
232233
OSABI = ELF::ELFOSABI_AMDGPU_HSA;

llvm/lib/Target/AMDGPU/SIPreAllocateWWMRegs.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ void SIPreAllocateWWMRegs::rewriteRegs(MachineFunction &MF) {
130130
if (VirtReg.isPhysical())
131131
continue;
132132

133+
if (MI.isDebugInstr() && VirtReg == AMDGPU::NoRegister)
134+
continue;
135+
133136
if (!VRM->hasPhys(VirtReg))
134137
continue;
135138

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
; RUN: llc %s -o %t.o -mcpu=gfx1030 -filetype=obj -O0
2+
; RUN: llvm-debuginfo-analyzer %t.o --print=all --attribute=all | FileCheck %s
3+
4+
; This test compiles this module with AMDGPU backend under -O0,
5+
; and makes sure llvm-debuginfo-analzyer works for it.
6+
7+
; Simple checks to make sure llvm-debuginfo-analzyer didn't fail early.
8+
; CHECK: Logical View:
9+
; CHECK: {CompileUnit}
10+
; CHECK: {Code} 's_endpgm'
11+
12+
source_filename = "module"
13+
target datalayout = "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-p7:160:256:256:32-p8:128:128-p9:192:256:256:32-p10:32:32-p11:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8:9-p32:32:32-v8:8-v16:16-v32:32-v48:32-v64:32-v80:32-v96:32-v112:32-v128:32-v144:32-v160:32-v176:32-v192:32-v208:32-v224:32-v240:32-v256:32-i1:32-i8:8-i16:16-i32:32-i64:32-f16:16-f32:32-f64:32"
14+
target triple = "amdgcn-amd-amdpal"
15+
16+
%dx.types.ResRet.f32 = type { float, float, float, float, i32 }
17+
18+
; Function Attrs: memory(readwrite)
19+
define dllexport amdgpu_cs void @_amdgpu_cs_main(i32 inreg noundef %globalTable, i32 inreg noundef %userdata4, <3 x i32> inreg noundef %WorkgroupId, i32 inreg noundef %MultiDispatchInfo, <3 x i32> noundef %LocalInvocationId) #0 !dbg !14 {
20+
%LocalInvocationId.i0 = extractelement <3 x i32> %LocalInvocationId, i64 0, !dbg !28
21+
%WorkgroupId.i0 = extractelement <3 x i32> %WorkgroupId, i64 0, !dbg !28
22+
%1 = call i64 @llvm.amdgcn.s.getpc(), !dbg !28
23+
%2 = shl i32 %WorkgroupId.i0, 6, !dbg !28
24+
%3 = add i32 %LocalInvocationId.i0, %2, !dbg !28
25+
#dbg_value(i32 %3, !29, !DIExpression(DW_OP_LLVM_fragment, 0, 32), !28)
26+
%4 = and i64 %1, -4294967296, !dbg !30
27+
%5 = zext i32 %userdata4 to i64, !dbg !30
28+
%6 = or disjoint i64 %4, %5, !dbg !30
29+
%7 = inttoptr i64 %6 to ptr addrspace(4), !dbg !30
30+
call void @llvm.assume(i1 true) [ "align"(ptr addrspace(4) %7, i32 4), "dereferenceable"(ptr addrspace(4) %7, i32 -1) ], !dbg !30
31+
%8 = load <4 x i32>, ptr addrspace(4) %7, align 4, !dbg !30, !invariant.load !2
32+
%9 = call float @llvm.amdgcn.struct.buffer.load.format.f32(<4 x i32> %8, i32 %3, i32 0, i32 0, i32 0), !dbg !30
33+
#dbg_value(%dx.types.ResRet.f32 poison, !31, !DIExpression(), !32)
34+
%10 = fmul reassoc arcp contract afn float %9, 2.000000e+00, !dbg !33
35+
#dbg_value(float %10, !34, !DIExpression(), !35)
36+
call void @llvm.assume(i1 true) [ "align"(ptr addrspace(4) %7, i32 4), "dereferenceable"(ptr addrspace(4) %7, i32 -1) ], !dbg !36
37+
%11 = getelementptr i8, ptr addrspace(4) %7, i64 32, !dbg !36
38+
%.upto01 = insertelement <4 x float> poison, float %10, i64 0, !dbg !36
39+
%12 = shufflevector <4 x float> %.upto01, <4 x float> poison, <4 x i32> zeroinitializer, !dbg !36
40+
%13 = load <4 x i32>, ptr addrspace(4) %11, align 4, !dbg !36, !invariant.load !2
41+
call void @llvm.amdgcn.struct.buffer.store.format.v4f32(<4 x float> %12, <4 x i32> %13, i32 %3, i32 0, i32 0, i32 0), !dbg !36
42+
ret void, !dbg !37
43+
}
44+
45+
; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
46+
declare noundef i64 @llvm.amdgcn.s.getpc() #1
47+
48+
; Function Attrs: nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write)
49+
declare void @llvm.assume(i1 noundef) #2
50+
51+
; Function Attrs: nocallback nofree nosync nounwind willreturn memory(write)
52+
declare void @llvm.amdgcn.struct.buffer.store.format.v4f32(<4 x float>, <4 x i32>, i32, i32, i32, i32 immarg) #3
53+
54+
; Function Attrs: nocallback nofree nosync nounwind willreturn memory(read)
55+
declare float @llvm.amdgcn.struct.buffer.load.format.f32(<4 x i32>, i32, i32, i32, i32 immarg) #4
56+
57+
attributes #0 = { memory(readwrite) "amdgpu-flat-work-group-size"="64,64" "amdgpu-memory-bound"="false" "amdgpu-num-sgpr"="4294967295" "amdgpu-num-vgpr"="4294967295" "amdgpu-prealloc-sgpr-spill-vgprs" "amdgpu-unroll-threshold"="1200" "amdgpu-wave-limiter"="false" "amdgpu-work-group-info-arg-no"="3" "denormal-fp-math"="ieee" "denormal-fp-math-f32"="preserve-sign" "target-features"=",+wavefrontsize64,+cumode,+enable-flat-scratch" }
58+
attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
59+
attributes #2 = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write) }
60+
attributes #3 = { nocallback nofree nosync nounwind willreturn memory(write) }
61+
attributes #4 = { nocallback nofree nosync nounwind willreturn memory(read) }
62+
63+
!llvm.dbg.cu = !{!0}
64+
!llvm.module.flags = !{!12, !13}
65+
66+
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "dxcoob 1.7.2308.16 (52da17e29)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, globals: !3)
67+
!1 = !DIFile(filename: "tests\\basic_var.hlsl", directory: "")
68+
!2 = !{}
69+
!3 = !{!4, !10}
70+
!4 = distinct !DIGlobalVariableExpression(var: !5, expr: !DIExpression())
71+
!5 = !DIGlobalVariable(name: "u0", linkageName: "\01?u0@@3V?$RWBuffer@M@@A", scope: !0, file: !1, line: 2, type: !6, isLocal: false, isDefinition: true)
72+
!6 = !DICompositeType(tag: DW_TAG_class_type, name: "RWBuffer<float>", file: !1, line: 2, size: 32, align: 32, elements: !2, templateParams: !7)
73+
!7 = !{!8}
74+
!8 = !DITemplateTypeParameter(name: "element", type: !9)
75+
!9 = !DIBasicType(name: "float", size: 32, align: 32, encoding: DW_ATE_float)
76+
!10 = distinct !DIGlobalVariableExpression(var: !11, expr: !DIExpression())
77+
!11 = !DIGlobalVariable(name: "u1", linkageName: "\01?u1@@3V?$RWBuffer@M@@A", scope: !0, file: !1, line: 3, type: !6, isLocal: false, isDefinition: true)
78+
!12 = !{i32 2, !"Dwarf Version", i32 5}
79+
!13 = !{i32 2, !"Debug Info Version", i32 3}
80+
!14 = distinct !DISubprogram(name: "main", scope: !1, file: !1, line: 7, type: !15, scopeLine: 7, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0)
81+
!15 = !DISubroutineType(types: !16)
82+
!16 = !{null, !17}
83+
!17 = !DIDerivedType(tag: DW_TAG_typedef, name: "uint3", file: !1, baseType: !18)
84+
!18 = !DICompositeType(tag: DW_TAG_class_type, name: "vector<unsigned int, 3>", file: !1, size: 96, align: 32, elements: !19, templateParams: !24)
85+
!19 = !{!20, !22, !23}
86+
!20 = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !18, file: !1, baseType: !21, size: 32, align: 32, flags: DIFlagPublic)
87+
!21 = !DIBasicType(name: "unsigned int", size: 32, align: 32, encoding: DW_ATE_unsigned)
88+
!22 = !DIDerivedType(tag: DW_TAG_member, name: "y", scope: !18, file: !1, baseType: !21, size: 32, align: 32, offset: 32, flags: DIFlagPublic)
89+
!23 = !DIDerivedType(tag: DW_TAG_member, name: "z", scope: !18, file: !1, baseType: !21, size: 32, align: 32, offset: 64, flags: DIFlagPublic)
90+
!24 = !{!25, !26}
91+
!25 = !DITemplateTypeParameter(name: "element", type: !21)
92+
!26 = !DITemplateValueParameter(name: "element_count", type: !27, value: i32 3)
93+
!27 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
94+
!28 = !DILocation(line: 7, column: 17, scope: !14)
95+
!29 = !DILocalVariable(name: "dtid", arg: 1, scope: !14, file: !1, line: 7, type: !17)
96+
!30 = !DILocation(line: 11, column: 18, scope: !14)
97+
!31 = !DILocalVariable(name: "my_var", scope: !14, file: !1, line: 11, type: !9)
98+
!32 = !DILocation(line: 11, column: 9, scope: !14)
99+
!33 = !DILocation(line: 14, column: 26, scope: !14)
100+
!34 = !DILocalVariable(name: "my_var2", scope: !14, file: !1, line: 14, type: !9)
101+
!35 = !DILocation(line: 14, column: 9, scope: !14)
102+
!36 = !DILocation(line: 17, column: 14, scope: !14)
103+
!37 = !DILocation(line: 19, column: 1, scope: !14)

0 commit comments

Comments
 (0)