Issue |
91451
|
Summary |
[Clang][DebugInfo] typedef in template class given wrong scope
|
Labels |
clang
|
Assignees |
|
Reporter |
OCHyams
|
Clang trunk built at d4cf20ca37160cb062a9db773d0e6255d6bbc31a (19.0)
Godbolt version of example below https://godbolt.org/z/7esxK8dbY
$ cat test.cpp
```
struct X {
typedef int inside;
inside i;
};
template <typename T = int>
struct Y {
typedef int outside;
outside o;
};
X x;
Y<> y;
```
The DIE for `outside` is scoped to `DW_TAG_compile_unit (0x0000000b)` while the DIE for `inside` is scoped to its enclosing `DW_TAG_structure_type (0x00000033)`. `outside` should be scoped to the `DW_TAG_structure_type` DIE for `Y<int>` (`0x00000070`).
$ clang -O0 -g test.cpp -o - | llvm-dwarfdump -
```
0x00000000: Compile Unit: length = 0x00000097, format = DWARF32, version = 0x0004, abbr_offset = 0x0000, addr_size = 0x08 (next unit at 0x0000009b)
0x0000000b: DW_TAG_compile_unit
DW_AT_producer ("clang version 19.0.0git (https://github.com/llvm/llvm-project.git d4cf20ca37160cb062a9db773d0e6255d6bbc31a)")
DW_AT_language (DW_LANG_C_plus_plus_14)
DW_AT_name ("test.cpp")
DW_AT_stmt_list (0x00000000)
DW_AT_comp_dir ("/")
0x0000001e: DW_TAG_variable
DW_AT_name ("x")
DW_AT_type (0x00000033 "X")
DW_AT_external (true)
DW_AT_decl_file ("test.cpp")
DW_AT_decl_line (12)
DW_AT_location (DW_OP_addr 0x0)
0x00000033: DW_TAG_structure_type
DW_AT_calling_convention (DW_CC_pass_by_value)
DW_AT_name ("X")
DW_AT_byte_size (0x04)
DW_AT_decl_file ("test.cpp")
DW_AT_decl_line (1)
0x0000003c: DW_TAG_member
DW_AT_name ("i")
DW_AT_type (0x00000048 "inside")
DW_AT_decl_file ("test.cpp")
DW_AT_decl_line (3)
DW_AT_data_member_location (0x00)
0x00000048: DW_TAG_typedef
DW_AT_type (0x00000054 "int")
DW_AT_name ("inside")
DW_AT_decl_file ("test.cpp")
DW_AT_decl_line (2)
0x00000053: NULL
0x00000054: DW_TAG_base_type
DW_AT_name ("int")
DW_AT_encoding (DW_ATE_signed)
DW_AT_byte_size (0x04)
0x0000005b: DW_TAG_variable
DW_AT_name ("y")
DW_AT_type (0x00000070 "Y<int>")
DW_AT_external (true)
DW_AT_decl_file ("test.cpp")
DW_AT_decl_line (13)
DW_AT_location (DW_OP_addr 0x0)
0x00000070: DW_TAG_structure_type
DW_AT_calling_convention (DW_CC_pass_by_value)
DW_AT_name ("Y<int>")
DW_AT_byte_size (0x04)
DW_AT_decl_file ("test.cpp")
DW_AT_decl_line (7)
0x00000079: DW_TAG_template_type_parameter
DW_AT_type (0x00000054 "int")
DW_AT_name ("T")
DW_AT_default_value (true)
0x00000082: DW_TAG_member
DW_AT_name ("o")
DW_AT_type (0x0000008f "outside")
DW_AT_decl_file ("test.cpp")
DW_AT_decl_line (9)
DW_AT_data_member_location (0x00)
0x0000008e: NULL
0x0000008f: DW_TAG_typedef
DW_AT_type (0x00000054 "int")
DW_AT_name ("outside")
DW_AT_decl_file ("test.cpp")
DW_AT_decl_line (8)
0x0000009a: NULL
```
Looking at the IR produced by Clang:
$ clang -O0 -g test.cpp -emit-llvm -S -o -
```
source_filename = "test.cpp"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
%struct.X = type { i32 }
%struct.Y = type { i32 }
@x = dso_local global %struct.X zeroinitializer, align 4, !dbg !0
@y = dso_local global %struct.Y zeroinitializer, align 4, !dbg !5
!llvm.dbg.cu = !{!2}
!llvm.module.flags = !{!19, !20, !21, !22, !23, !24, !25}
!llvm.ident = !{!26}
!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
!1 = distinct !DIGlobalVariable(name: "x", scope: !2, file: !7, line: 12, type: !15, isLocal: false, isDefinition: true)
!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !3, producer: "clang version 19.0.0git (https://github.com/llvm/llvm-project.git d4cf20ca37160cb062a9db773d0e6255d6bbc31a)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, globals: !4, splitDebugInlining: false, nameTableKind: None)
!3 = !DIFile(filename: "test.cpp")
!4 = !{!0, !5}
!5 = !DIGlobalVariableExpression(var: !6, expr: !DIExpression())
!6 = distinct !DIGlobalVariable(name: "y", scope: !2, file: !7, line: 13, type: !8, isLocal: false, isDefinition: true)
!7 = !DIFile(filename: "example.cpp"test.cpp)
!8 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "Y<int>", file: !7, line: 7, size: 32, flags: DIFlagTypePassByValue, elements: !9, templateParams: !13, identifier: "_ZTS1YIiE")
!9 = !{!10}
!10 = !DIDerivedType(tag: DW_TAG_member, name: "o", scope: !8, file: !7, line: 9, baseType: !11, size: 32)
!11 = !DIDerivedType(tag: DW_TAG_typedef, name: "outside", file: !7, line: 8, baseType: !12)
!12 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!13 = !{!14}
!14 = !DITemplateTypeParameter(name: "T", type: !12, defaulted: true)
!15 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "X", file: !7, line: 1, size: 32, flags: DIFlagTypePassByValue, elements: !16, identifier: "_ZTS1X")
!16 = !{!17}
!17 = !DIDerivedType(tag: DW_TAG_member, name: "i", scope: !15, file: !7, line: 3, baseType: !18, size: 32)
!18 = !DIDerivedType(tag: DW_TAG_typedef, name: "inside", scope: !15, file: !7, line: 2, baseType: !12)
!19 = !{i32 7, !"Dwarf Version", i32 4}
!20 = !{i32 2, !"Debug Info Version", i32 3}
!21 = !{i32 1, !"wchar_size", i32 4}
!22 = !{i32 8, !"PIC Level", i32 2}
!23 = !{i32 7, !"PIE Level", i32 2}
!24 = !{i32 7, !"uwtable", i32 2}
!25 = !{i32 7, !"frame-pointer", i32 2}
!26 = !{!"clang version 19.0.0git (https://github.com/llvm/llvm-project.git d4cf20ca37160cb062a9db773d0e6255d6bbc31a)"}
```
`inside` has a `scope` field pointing to `X`.
```
!15 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "X", ...)
!18 = !DIDerivedType(tag: DW_TAG_typedef, name: "inside", scope: !15, file: !7, line: 2, baseType: !12)
```
`outside` has no scope field.
```
!11 = !DIDerivedType(tag: DW_TAG_typedef, name: "outside", file: !7, line: 8, baseType: !12)
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs