llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-codegen

Author: yonghong-song

<details>
<summary>Changes</summary>

Emil Tsalapatis suggested to add type tag for typedef like below:
```
  $ cat tag.c
  #define __type_tag(x) __attribute__((btf_type_tag(x)))

  struct bar { int c; int d; };
  typedef struct bar __type_tag("a") bar_t;
  int use(bar_t *v)
  {
    return v-&gt;c + v-&gt;d;
  }
```
This makes the code simpler -- using `bar_t *v` instead of the longer form 
`struct bar __type_tag("a") *v`.

So the goal is to allow type tag for typedef underlying types. The following 
describes the main changes:

  - CGDebugInfo: factor the btf_type_tag walk out of CreatePointerLikeType into 
a new CollectBTFTypeTagAnnotations() helper, and use it when emitting a 
typedef's DIDerivedType so the typedef carries both its btf_decl_tag 
annotations (on the declaration) and the btf_type_tag annotations (on the 
underlying type).

  - BPF BTFDebug: emit type tags for DW_TAG_typedef the same way they are 
emitted for DW_TAG_pointer_type, building the intermediate BTF_KIND_TYPE_TAG 
chain. The BTFTypeDerived constructor now selects BTF_KIND_PTR or 
BTF_KIND_TYPEDEF based on the DWARF tag.

---
Full diff: https://github.com/llvm/llvm-project/pull/203089.diff


6 Files Affected:

- (modified) clang/include/clang/Basic/AttrDocs.td (+17-2) 
- (modified) clang/lib/CodeGen/CGDebugInfo.cpp (+35-18) 
- (modified) clang/lib/CodeGen/CGDebugInfo.h (+5) 
- (added) clang/test/DebugInfo/Generic/attr-btf_type_tag-typedef-no-ptr.c (+40) 
- (modified) llvm/lib/Target/BPF/BTFDebug.cpp (+16-6) 
- (added) llvm/test/CodeGen/BPF/BTF/type-tag-typedef-noptr.ll (+137) 


``````````diff
diff --git a/clang/include/clang/Basic/AttrDocs.td 
b/clang/include/clang/Basic/AttrDocs.td
index dab778d4047aa..4501f2c16ef62 100644
--- a/clang/include/clang/Basic/AttrDocs.td
+++ b/clang/include/clang/Basic/AttrDocs.td
@@ -3042,8 +3042,23 @@ def BTFTypeTagDocs : Documentation {
   let Category = DocCatType;
   let Content = [{
 Clang supports the ``__attribute__((btf_type_tag("ARGUMENT")))`` attribute for
-all targets. It only has effect when ``-g`` is specified on the command line 
and
-is currently silently ignored when not applied to a pointer type (note: this
+all targets. It only has effect when ``-g`` is specified on the command line.
+
+The attribute can be applied to a pointer type, in which case the tag is
+associated with the pointee type, e.g.:
+
+.. code-block:: c
+
+  int __attribute__((btf_type_tag("tag"))) *p;
+
+It can also be applied to the underlying type of a typedef, in which case the
+tag follows the typedef down to its base type, e.g.:
+
+.. code-block:: c
+
+  typedef struct foo __attribute__((btf_type_tag("tag"))) foo_t;
+
+The attribute is currently silently ignored in any other position (note: this
 scenario may be diagnosed in the future).
 
 The ``ARGUMENT`` string will be preserved in IR and emitted to DWARF for the
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp 
b/clang/lib/CodeGen/CGDebugInfo.cpp
index 3d429d0d78e82..7a91e47990a22 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -1531,23 +1531,8 @@ llvm::DIType 
*CGDebugInfo::CreatePointerLikeType(llvm::dwarf::Tag Tag,
       CGM.getTarget().getDWARFAddressSpace(
           CGM.getTypes().getTargetAddressSpace(PointeeTy));
 
-  const BTFTagAttributedType *BTFAttrTy;
-  if (auto *Atomic = PointeeTy->getAs<AtomicType>())
-    BTFAttrTy = dyn_cast<BTFTagAttributedType>(Atomic->getValueType());
-  else
-    BTFAttrTy = dyn_cast<BTFTagAttributedType>(PointeeTy);
   SmallVector<llvm::Metadata *, 4> Annots;
-  while (BTFAttrTy) {
-    StringRef Tag = BTFAttrTy->getAttr()->getBTFTypeTag();
-    if (!Tag.empty()) {
-      llvm::Metadata *Ops[2] = {
-          llvm::MDString::get(CGM.getLLVMContext(), StringRef("btf_type_tag")),
-          llvm::MDString::get(CGM.getLLVMContext(), Tag)};
-      Annots.insert(Annots.begin(),
-                    llvm::MDNode::get(CGM.getLLVMContext(), Ops));
-    }
-    BTFAttrTy = dyn_cast<BTFTagAttributedType>(BTFAttrTy->getWrappedType());
-  }
+  CollectBTFTypeTagAnnotations(PointeeTy, Annots);
 
   llvm::DINodeArray Annotations = nullptr;
   if (Annots.size() > 0)
@@ -1780,8 +1765,19 @@ llvm::DIType *CGDebugInfo::CreateType(const TypedefType 
*Ty,
   SourceLocation Loc = Ty->getDecl()->getLocation();
 
   uint32_t Align = getDeclAlignIfRequired(Ty->getDecl(), CGM.getContext());
-  // Typedefs are derived from some other type.
-  llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(Ty->getDecl());
+
+  // Typedefs are derived from some other type. Collect both btf_decl_tag
+  // annotations on the typedef declaration and btf_type_tag annotations on
+  // the (possibly non-pointer) underlying type, e.g.
+  //   typedef struct foo __attribute__((btf_type_tag("tag"))) foo_t;
+  SmallVector<llvm::Metadata *, 4> Annots;
+  llvm::DINodeArray Annotations;
+  CollectBTFTypeTagAnnotations(Ty->getDecl()->getUnderlyingType(), Annots);
+  if (llvm::DINodeArray DeclTags = CollectBTFDeclTagAnnotations(Ty->getDecl()))
+    for (llvm::Metadata *MD : DeclTags->operands())
+      Annots.push_back(MD);
+  if (!Annots.empty())
+    Annotations = DBuilder.getOrCreateArray(Annots);
 
   llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
   const DeclContext *DC = Ty->getDecl()->getDeclContext();
@@ -2858,6 +2854,27 @@ llvm::DINodeArray 
CGDebugInfo::CollectBTFDeclTagAnnotations(const Decl *D) {
   return DBuilder.getOrCreateArray(Annotations);
 }
 
+void CGDebugInfo::CollectBTFTypeTagAnnotations(
+    QualType Ty, SmallVectorImpl<llvm::Metadata *> &Annotations) {
+  const BTFTagAttributedType *BTFAttrTy;
+  if (auto *Atomic = Ty->getAs<AtomicType>())
+    BTFAttrTy = dyn_cast<BTFTagAttributedType>(Atomic->getValueType());
+  else
+    BTFAttrTy = dyn_cast<BTFTagAttributedType>(Ty);
+
+  while (BTFAttrTy) {
+    StringRef Tag = BTFAttrTy->getAttr()->getBTFTypeTag();
+    if (!Tag.empty()) {
+      llvm::Metadata *Ops[2] = {
+          llvm::MDString::get(CGM.getLLVMContext(), StringRef("btf_type_tag")),
+          llvm::MDString::get(CGM.getLLVMContext(), Tag)};
+      Annotations.insert(Annotations.begin(),
+                         llvm::MDNode::get(CGM.getLLVMContext(), Ops));
+    }
+    BTFAttrTy = dyn_cast<BTFTagAttributedType>(BTFAttrTy->getWrappedType());
+  }
+}
+
 llvm::DIType *CGDebugInfo::getOrCreateVTablePtrType(llvm::DIFile *Unit) {
   if (VTablePtrType)
     return VTablePtrType;
diff --git a/clang/lib/CodeGen/CGDebugInfo.h b/clang/lib/CodeGen/CGDebugInfo.h
index 4c385c26efc4e..0434caee7554e 100644
--- a/clang/lib/CodeGen/CGDebugInfo.h
+++ b/clang/lib/CodeGen/CGDebugInfo.h
@@ -349,6 +349,11 @@ class CGDebugInfo {
   /// A helper function to collect debug info for btf_decl_tag annotations.
   llvm::DINodeArray CollectBTFDeclTagAnnotations(const Decl *D);
 
+  /// A helper function to collect debug info for btf_type_tag annotations.
+  void
+  CollectBTFTypeTagAnnotations(QualType Ty,
+                               SmallVectorImpl<llvm::Metadata *> &Annotations);
+
   llvm::DIType *createFieldType(StringRef name, QualType type,
                                 SourceLocation loc, AccessSpecifier AS,
                                 uint64_t offsetInBits, uint32_t AlignInBits,
diff --git a/clang/test/DebugInfo/Generic/attr-btf_type_tag-typedef-no-ptr.c 
b/clang/test/DebugInfo/Generic/attr-btf_type_tag-typedef-no-ptr.c
new file mode 100644
index 0000000000000..52616ae2e5de5
--- /dev/null
+++ b/clang/test/DebugInfo/Generic/attr-btf_type_tag-typedef-no-ptr.c
@@ -0,0 +1,40 @@
+// RUN: %clang_cc1 -triple %itanium_abi_triple -debug-info-kind=limited 
-emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple %itanium_abi_triple -DDOUBLE_BRACKET_ATTRS=1 
-debug-info-kind=limited -emit-llvm -o - %s | FileCheck %s
+
+#if DOUBLE_BRACKET_ATTRS
+#define __tag1 [[clang::btf_type_tag("tag1")]]
+#define __tag2 [[clang::btf_type_tag("tag2")]]
+#else
+#define __tag1 __attribute__((btf_type_tag("tag1")))
+#define __tag2 __attribute__((btf_type_tag("tag2")))
+#endif
+
+struct bar {
+  int c;
+};
+typedef struct bar __tag1 __tag2 bar_t1;
+typedef const struct bar __tag1 __tag2 bar_t2;
+typedef volatile struct bar __tag1 __tag2 bar_t3;
+typedef volatile struct bar * __tag1 __tag2 bar_t4;
+
+typedef const int __tag1 __tag2 int_v;
+
+int use(bar_t1 *v1, bar_t2 *v2, bar_t3 *v3, bar_t4 v4, int_v v5)
+{
+  return v1->c + v2->c + v3->c + v4->c + v5;
+}
+
+// CHECK: ![[L4:[0-9]+]] = !DIBasicType(name: "int", size: 32, encoding: 
DW_ATE_signed)
+// CHECK: ![[L10:[0-9]+]] = !DIDerivedType(tag: DW_TAG_typedef, name: 
"bar_t1", file: ![[#]], line: [[#]], baseType: ![[L11:[0-9]+]], annotations: 
![[L14:[0-9]+]])
+// CHECK: ![[L11]] = distinct !DICompositeType(tag: DW_TAG_structure_type, 
name: "bar", file: ![[#]], line: [[#]], size: [[#]], elements: ![[#]])
+// CHECK: ![[L14]] = !{![[L15:[0-9]+]], ![[L16:[0-9]+]]}
+// CHECK: ![[L15]] = !{!"btf_type_tag", !"tag1"}
+// CHECK: ![[L16]] = !{!"btf_type_tag", !"tag2"}
+// CHECK: ![[L18:[0-9]+]] = !DIDerivedType(tag: DW_TAG_typedef, name: 
"bar_t2", file: ![[#]], line: [[#]], baseType: ![[L19:[0-9]+]], annotations: 
![[L14]])
+// CHECK: ![[L19]] = !DIDerivedType(tag: DW_TAG_const_type, baseType: ![[L11]])
+// CHECK: ![[L21:[0-9]+]] = !DIDerivedType(tag: DW_TAG_typedef, name: 
"bar_t3", file: ![[#]], line: [[#]], baseType: ![[L22:[0-9]+]], annotations: 
![[L14]])
+// CHECK: ![[L22]] = !DIDerivedType(tag: DW_TAG_volatile_type, baseType: 
![[L11]])
+// CHECK: ![[L23:[0-9]+]] = !DIDerivedType(tag: DW_TAG_typedef, name: 
"bar_t4", file: ![[#]], line: [[#]], baseType: ![[L24:[0-9]+]], annotations: 
![[L14]])
+// CHECK: ![[L24]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: 
![[L22]], size: [[#]])
+// CHECK: ![[L25:[0-9]+]] = !DIDerivedType(tag: DW_TAG_typedef, name: "int_v", 
file: ![[#]], line: [[#]], baseType: ![[L26:[0-9]+]], annotations: ![[L14]])
+// CHECK: ![[L26]] = !DIDerivedType(tag: DW_TAG_const_type, baseType: ![[L4]])
diff --git a/llvm/lib/Target/BPF/BTFDebug.cpp b/llvm/lib/Target/BPF/BTFDebug.cpp
index 1b7a1cbc561b0..3a9d461bc5b93 100644
--- a/llvm/lib/Target/BPF/BTFDebug.cpp
+++ b/llvm/lib/Target/BPF/BTFDebug.cpp
@@ -284,11 +284,21 @@ BTFTypeDerived::BTFTypeDerived(const DIDerivedType *DTy, 
unsigned Tag,
   BTFType.Info = Kind << 24;
 }
 
-/// Used by DW_TAG_pointer_type only.
+/// Used by DW_TAG_pointer_type and DW_TAG_typedef only.
 BTFTypeDerived::BTFTypeDerived(unsigned NextTypeId, unsigned Tag,
                                StringRef Name)
     : DTy(nullptr), NeedsFixup(false), Name(Name) {
-  Kind = BTF::BTF_KIND_PTR;
+  switch (Tag) {
+  case dwarf::DW_TAG_pointer_type:
+    Kind = BTF::BTF_KIND_PTR;
+    break;
+  case dwarf::DW_TAG_typedef:
+    Kind = BTF::BTF_KIND_TYPEDEF;
+    break;
+  default:
+    llvm_unreachable("Tag must be pointer or typedef");
+  }
+
   BTFType.Info = Kind << 24;
   BTFType.Type = NextTypeId;
 }
@@ -1167,7 +1177,7 @@ void BTFDebug::visitDerivedType(const DIDerivedType *DTy, 
uint32_t &TypeId,
     }
   }
 
-  if (Tag == dwarf::DW_TAG_pointer_type) {
+  if (Tag == dwarf::DW_TAG_pointer_type || Tag == dwarf::DW_TAG_typedef) {
     int TmpTypeId = genBTFTypeTags(DTy, -1);
     if (TmpTypeId >= 0) {
       auto TypeDEntry =
@@ -1177,13 +1187,13 @@ void BTFDebug::visitDerivedType(const DIDerivedType 
*DTy, uint32_t &TypeId,
       auto TypeEntry = std::make_unique<BTFTypeDerived>(DTy, Tag, false);
       TypeId = addType(std::move(TypeEntry), DTy);
     }
-  } else if (Tag == dwarf::DW_TAG_typedef || Tag == dwarf::DW_TAG_const_type ||
+    if (Tag == dwarf::DW_TAG_typedef)
+      processDeclAnnotations(DTy->getAnnotations(), TypeId, -1);
+  } else if (Tag == dwarf::DW_TAG_const_type ||
              Tag == dwarf::DW_TAG_volatile_type ||
              Tag == dwarf::DW_TAG_restrict_type) {
     auto TypeEntry = std::make_unique<BTFTypeDerived>(DTy, Tag, false);
     TypeId = addType(std::move(TypeEntry), DTy);
-    if (Tag == dwarf::DW_TAG_typedef)
-      processDeclAnnotations(DTy->getAnnotations(), TypeId, -1);
   } else if (Tag != dwarf::DW_TAG_member) {
     return;
   }
diff --git a/llvm/test/CodeGen/BPF/BTF/type-tag-typedef-noptr.ll 
b/llvm/test/CodeGen/BPF/BTF/type-tag-typedef-noptr.ll
new file mode 100644
index 0000000000000..fc4a965f2ee70
--- /dev/null
+++ b/llvm/test/CodeGen/BPF/BTF/type-tag-typedef-noptr.ll
@@ -0,0 +1,137 @@
+; RUN: llc -mtriple=bpfel -filetype=obj -o %t1 %s
+; RUN: llvm-objcopy --dump-section='.BTF'=%t2 %t1
+; RUN: %python %p/print_btf.py %t2 | FileCheck -check-prefixes=CHECK-BTF %s
+; RUN: llc -mtriple=bpfeb -filetype=obj -o %t1 %s
+; RUN: llvm-objcopy --dump-section='.BTF'=%t2 %t1
+; RUN: %python %p/print_btf.py %t2 | FileCheck -check-prefixes=CHECK-BTF %s
+;
+; Source:
+;  #define __tag1 __attribute__((btf_type_tag("tag1")))
+;  #define __tag2 __attribute__((btf_type_tag("tag2")))
+;
+;  struct bar {
+;    int c;
+;  };
+;  typedef struct bar __tag1 __tag2 bar_t1;
+;  typedef const struct bar __tag1 __tag2 bar_t2;
+;  typedef volatile struct bar __tag1 __tag2 bar_t3;
+;  typedef volatile struct bar * __tag1 __tag2 bar_t4;
+;
+;  typedef const int __tag1 __tag2 int_v;
+;
+;  int use(bar_t1 *v1, bar_t2 *v2, bar_t3 *v3, bar_t4 v4, int_v v5)
+;  {
+;    return v1->c + v2->c + v3->c + v4.c + v5;
+;  }
+; Compilation flag:
+;  clang -target bpf -O2 -g -S -emit-llvm t.c
+
+; Function Attrs: nofree norecurse nosync nounwind memory(argmem: readwrite, 
inaccessiblemem: readwrite)
+define dso_local i32 @use(ptr nofree noundef readonly captures(none) %0, ptr 
nofree noundef readonly captures(none) %1, ptr nofree noundef captures(address) 
%2, ptr nofree noundef captures(address) %3, i32 noundef %4) local_unnamed_addr 
#0 !dbg !11 {
+    #dbg_value(ptr %0, !34, !DIExpression(), !39)
+    #dbg_value(ptr %1, !35, !DIExpression(), !39)
+    #dbg_value(ptr %2, !36, !DIExpression(), !39)
+    #dbg_value(ptr %3, !37, !DIExpression(), !39)
+    #dbg_value(i32 %4, !38, !DIExpression(), !39)
+  %6 = load i32, ptr %0, align 4, !dbg !40, !tbaa !41
+  %7 = load i32, ptr %1, align 4, !dbg !43, !tbaa !41
+  %8 = load volatile i32, ptr %2, align 4, !dbg !44, !tbaa !41
+  %9 = load volatile i32, ptr %3, align 4, !dbg !45, !tbaa !41
+  %10 = add i32 %6, %4, !dbg !46
+  %11 = add i32 %10, %7, !dbg !47
+  %12 = add i32 %11, %8, !dbg !48
+  %13 = add i32 %12, %9, !dbg !49
+  ret i32 %13, !dbg !50
+}
+
+; CHECK-BTF: [1] PTR '(anon)' type_id=4
+; CHECK-BTF: [2] TYPE_TAG 'tag1' type_id=5
+; CHECK-BTF: [3] TYPE_TAG 'tag2' type_id=2
+; CHECK-BTF: [4] TYPEDEF 'bar_t1' type_id=3
+; CHECK-BTF: [5] STRUCT 'bar' size=4 vlen=1
+; CHECK-BTF:   'c' type_id=6 bits_offset=0
+; CHECK-BTF: [6] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED
+; CHECK-BTF: [7] PTR '(anon)' type_id=10
+; CHECK-BTF: [8] TYPE_TAG 'tag1' type_id=11
+; CHECK-BTF: [9] TYPE_TAG 'tag2' type_id=8
+; CHECK-BTF: [10] TYPEDEF 'bar_t2' type_id=9
+; CHECK-BTF: [11] CONST '(anon)' type_id=5
+; CHECK-BTF: [12] PTR '(anon)' type_id=15
+; CHECK-BTF: [13] TYPE_TAG 'tag1' type_id=16
+; CHECK-BTF: [14] TYPE_TAG 'tag2' type_id=13
+; CHECK-BTF: [15] TYPEDEF 'bar_t3' type_id=14
+; CHECK-BTF: [16] VOLATILE '(anon)' type_id=5
+; CHECK-BTF: [17] TYPE_TAG 'tag1' type_id=20
+; CHECK-BTF: [18] TYPE_TAG 'tag2' type_id=17
+; CHECK-BTF: [19] TYPEDEF 'bar_t4' type_id=18
+; CHECK-BTF: [20] PTR '(anon)' type_id=16
+; CHECK-BTF: [21] TYPE_TAG 'tag1' type_id=24
+; CHECK-BTF: [22] TYPE_TAG 'tag2' type_id=21
+; CHECK-BTF: [23] TYPEDEF 'int_v' type_id=22
+; CHECK-BTF: [24] CONST '(anon)' type_id=6
+; CHECK-BTF: [25] FUNC_PROTO '(anon)' ret_type_id=6 vlen=5
+; CHECK-BTF:   'v1' type_id=1
+; CHECK-BTF:   'v2' type_id=7
+; CHECK-BTF:   'v3' type_id=12
+; CHECK-BTF:   'v4' type_id=19
+; CHECK-BTF:   'v5' type_id=23
+; CHECK-BTF: [26] FUNC 'use' type_id=25 linkage=global
+
+attributes #0 = { nofree norecurse nosync nounwind memory(argmem: readwrite, 
inaccessiblemem: readwrite) "frame-pointer"="all" "no-trapping-math"="true" 
"stack-protector-buffer-size"="8" }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!2, !3, !4, !5}
+!llvm.ident = !{!6}
+!llvm.errno.tbaa = !{!7}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C11, file: !1, producer: "clang 
version 23.0.0git ([email protected]:yonghong-song/llvm-project.git 
19865cd9403e3a25d2ab36f87d28f3d212342a7e)", isOptimized: true, runtimeVersion: 
0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
+!1 = !DIFile(filename: "t.c", directory: 
"/tmp/home/yhs/tests/typedef-tag-noptr", checksumkind: CSK_MD5, checksum: 
"837ae8c69aac4a5303c9a401fdefea04")
+!2 = !{i32 7, !"Dwarf Version", i32 5}
+!3 = !{i32 2, !"Debug Info Version", i32 3}
+!4 = !{i32 7, !"frame-pointer", i32 2}
+!5 = !{i32 7, !"debug-info-assignment-tracking", i1 true}
+!6 = !{!"clang version 23.0.0git 
([email protected]:yonghong-song/llvm-project.git 
19865cd9403e3a25d2ab36f87d28f3d212342a7e)"}
+!7 = !{!8, !8, i64 0}
+!8 = !{!"int", !9, i64 0}
+!9 = !{!"omnipotent char", !10, i64 0}
+!10 = !{!"Simple C/C++ TBAA"}
+!11 = distinct !DISubprogram(name: "use", scope: !1, file: !1, line: 14, type: 
!12, scopeLine: 15, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: 
DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !33, 
keyInstructions: true)
+!12 = !DISubroutineType(types: !13)
+!13 = !{!14, !15, !23, !26, !29, !31}
+!14 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
+!15 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !16, size: 64)
+!16 = !DIDerivedType(tag: DW_TAG_typedef, name: "bar_t1", file: !1, line: 7, 
baseType: !17, annotations: !20)
+!17 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "bar", file: 
!1, line: 4, size: 32, elements: !18)
+!18 = !{!19}
+!19 = !DIDerivedType(tag: DW_TAG_member, name: "c", scope: !17, file: !1, 
line: 5, baseType: !14, size: 32)
+!20 = !{!21, !22}
+!21 = !{!"btf_type_tag", !"tag1"}
+!22 = !{!"btf_type_tag", !"tag2"}
+!23 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !24, size: 64)
+!24 = !DIDerivedType(tag: DW_TAG_typedef, name: "bar_t2", file: !1, line: 8, 
baseType: !25, annotations: !20)
+!25 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !17)
+!26 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !27, size: 64)
+!27 = !DIDerivedType(tag: DW_TAG_typedef, name: "bar_t3", file: !1, line: 9, 
baseType: !28, annotations: !20)
+!28 = !DIDerivedType(tag: DW_TAG_volatile_type, baseType: !17)
+!29 = !DIDerivedType(tag: DW_TAG_typedef, name: "bar_t4", file: !1, line: 10, 
baseType: !30, annotations: !20)
+!30 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !28, size: 64)
+!31 = !DIDerivedType(tag: DW_TAG_typedef, name: "int_v", file: !1, line: 12, 
baseType: !32, annotations: !20)
+!32 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !14)
+!33 = !{!34, !35, !36, !37, !38}
+!34 = !DILocalVariable(name: "v1", arg: 1, scope: !11, file: !1, line: 14, 
type: !15)
+!35 = !DILocalVariable(name: "v2", arg: 2, scope: !11, file: !1, line: 14, 
type: !23)
+!36 = !DILocalVariable(name: "v3", arg: 3, scope: !11, file: !1, line: 14, 
type: !26)
+!37 = !DILocalVariable(name: "v4", arg: 4, scope: !11, file: !1, line: 14, 
type: !29)
+!38 = !DILocalVariable(name: "v5", arg: 5, scope: !11, file: !1, line: 14, 
type: !31)
+!39 = !DILocation(line: 0, scope: !11)
+!40 = !DILocation(line: 16, column: 20, scope: !11)
+!41 = !{!42, !8, i64 0}
+!42 = !{!"bar", !8, i64 0}
+!43 = !DILocation(line: 16, column: 28, scope: !11)
+!44 = !DILocation(line: 16, column: 36, scope: !11)
+!45 = !DILocation(line: 16, column: 44, scope: !11)
+!46 = !DILocation(line: 16, column: 22, scope: !11)
+!47 = !DILocation(line: 16, column: 30, scope: !11)
+!48 = !DILocation(line: 16, column: 38, scope: !11)
+!49 = !DILocation(line: 16, column: 46, scope: !11, atomGroup: 1, atomRank: 2)
+!50 = !DILocation(line: 16, column: 9, scope: !11, atomGroup: 1, atomRank: 1)

``````````

</details>


https://github.com/llvm/llvm-project/pull/203089
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to