llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-codegen Author: Shivam Kunwar (phyBrackets) <details> <summary>Changes</summary> Use `getElementAsAPInt(`) and emit bytes in target byte order instead of `getRawDataValues()` which exposes host endianness. This fixes test failures on big-endian hosts cross-compiling for little-endian targets. Reland of #<!-- -->182442 with endianness fix. --- Full diff: https://github.com/llvm/llvm-project/pull/184804.diff 4 Files Affected: - (modified) clang/lib/CodeGen/CGDebugInfo.cpp (+52) - (added) clang/test/DebugInfo/CXX/debug-info-constexpr-array.cpp (+53) - (modified) llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp (+24-1) - (added) llvm/test/DebugInfo/X86/debug-info-constexpr-array.ll (+192) ``````````diff diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index b6084a69382ba..cb1be37f718cc 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -2081,6 +2081,56 @@ void CGDebugInfo::CollectRecordLambdaFields( } } +/// Build an llvm::ConstantDataArray from the initialized elements of an +/// APValue array, using the narrowest integer type that fits the element width. +template <typename T> +static llvm::Constant * +buildConstantDataArrayFromElements(llvm::LLVMContext &Ctx, const APValue &Arr) { + const unsigned NumElts = Arr.getArraySize(); + SmallVector<T, 64> Vals( + NumElts, + Arr.hasArrayFiller() + ? static_cast<T>(Arr.getArrayFiller().getInt().getZExtValue()) + : 0); + for (unsigned I : llvm::seq(Arr.getArrayInitializedElts())) + Vals[I] = + static_cast<T>(Arr.getArrayInitializedElt(I).getInt().getZExtValue()); + return llvm::ConstantDataArray::get(Ctx, Vals); +} + +/// Try to create an llvm::Constant for a constexpr array of integer elements. +/// Handles arrays of char, short, int, long with element width up to 64 bits. +/// Returns nullptr if the array cannot be represented. +static llvm::Constant *tryEmitConstexprArrayAsConstant(CodeGenModule &CGM, + const VarDecl *Var, + const APValue *Value) { + const auto *ArrayTy = CGM.getContext().getAsConstantArrayType(Var->getType()); + if (!ArrayTy) + return nullptr; + + const QualType ElemQTy = ArrayTy->getElementType(); + if (ElemQTy.isNull() || !ElemQTy->isIntegerType()) + return nullptr; + + const uint64_t ElemBitWidth = CGM.getContext().getTypeSize(ElemQTy); + + llvm::LLVMContext &Ctx = CGM.getLLVMContext(); + switch (ElemBitWidth) { + case 8: + return buildConstantDataArrayFromElements<uint8_t>(Ctx, *Value); + case 16: + return buildConstantDataArrayFromElements<uint16_t>(Ctx, *Value); + case 32: + return buildConstantDataArrayFromElements<uint32_t>(Ctx, *Value); + case 64: + return buildConstantDataArrayFromElements<uint64_t>(Ctx, *Value); + default: + // ConstantDataArray only supports 8/16/32/64-bit elements. + // Wider types (e.g. __int128) are not representable. + return nullptr; + } +} + llvm::DIDerivedType * CGDebugInfo::CreateRecordStaticField(const VarDecl *Var, llvm::DIType *RecordTy, const RecordDecl *RD) { @@ -2103,6 +2153,8 @@ CGDebugInfo::CreateRecordStaticField(const VarDecl *Var, llvm::DIType *RecordTy, C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value->getInt()); if (Value->isFloat()) C = llvm::ConstantFP::get(CGM.getLLVMContext(), Value->getFloat()); + if (Value->isArray()) + C = tryEmitConstexprArrayAsConstant(CGM, Var, Value); } } diff --git a/clang/test/DebugInfo/CXX/debug-info-constexpr-array.cpp b/clang/test/DebugInfo/CXX/debug-info-constexpr-array.cpp new file mode 100644 index 0000000000000..28c1c09d5a999 --- /dev/null +++ b/clang/test/DebugInfo/CXX/debug-info-constexpr-array.cpp @@ -0,0 +1,53 @@ +// RUN: %clang_cc1 -triple x86_64-linux-gnu -std=c++17 -emit-llvm \ +// RUN: -debug-info-kind=standalone -o - %s | FileCheck %s + +using uint16_t = unsigned short; +using uint32_t = unsigned int; +using uint64_t = unsigned long long; + +struct Test { + static inline constexpr char STR[] = "Hello"; + static inline constexpr int NUMS[] = {1, 2, 3}; + static inline constexpr uint16_t SHORTS[] = {256, 512, 1024}; + static inline constexpr uint32_t INTS[] = {70000, 80000}; + static inline constexpr uint64_t LONGS[] = {4294967296ULL, 123456789ULL}; + static inline constexpr int NEG[] = {-1, -128, 42}; + // 128-bit integers and floating-point arrays should NOT produce extraData + // (not yet supported). + static inline constexpr __int128_t I128[] = {1, -1}; + static inline constexpr __uint128_t U128[] = {1, 2}; + static inline constexpr float FLOATS[] = {1.0f, 2.0f}; + static inline constexpr double DOUBLES[] = {1.0, 2.0}; +}; + +void use(const void*); +void test() { + use(&Test::STR); + use(&Test::NUMS); + use(&Test::SHORTS); + use(&Test::INTS); + use(&Test::LONGS); + use(&Test::NEG); + use(&Test::I128); + use(&Test::U128); + use(&Test::FLOATS); + use(&Test::DOUBLES); +} + +// Integer arrays: extraData on DIDerivedType member declarations. +// CHECK-DAG: !DIDerivedType(tag: DW_TAG_member, name: "STR",{{.*}}extraData: [6 x i8] c"Hello\00") +// CHECK-DAG: !DIDerivedType(tag: DW_TAG_member, name: "NUMS",{{.*}}extraData: [3 x i32] [i32 1, i32 2, i32 3]) +// CHECK-DAG: !DIDerivedType(tag: DW_TAG_member, name: "SHORTS",{{.*}}extraData: [3 x i16] [i16 256, i16 512, i16 1024]) +// CHECK-DAG: !DIDerivedType(tag: DW_TAG_member, name: "INTS",{{.*}}extraData: [2 x i32] [i32 70000, i32 80000]) +// CHECK-DAG: !DIDerivedType(tag: DW_TAG_member, name: "LONGS",{{.*}}extraData: [2 x i64] [i64 4294967296, i64 123456789]) +// CHECK-DAG: !DIDerivedType(tag: DW_TAG_member, name: "NEG",{{.*}}extraData: [3 x i32] [i32 -1, i32 -128, i32 42]) +// 128-bit integers: no extraData (not yet supported). +// CHECK-DAG: !DIDerivedType(tag: DW_TAG_member, name: "I128",{{.*}}flags: DIFlagStaticMember) +// CHECK-DAG: !DIDerivedType(tag: DW_TAG_member, name: "U128",{{.*}}flags: DIFlagStaticMember) +// CHECK-NOT: name: "I128",{{.*}}extraData: +// CHECK-NOT: name: "U128",{{.*}}extraData: +// Floating-point arrays: no extraData. +// CHECK-DAG: !DIDerivedType(tag: DW_TAG_member, name: "FLOATS",{{.*}}flags: DIFlagStaticMember) +// CHECK-DAG: !DIDerivedType(tag: DW_TAG_member, name: "DOUBLES",{{.*}}flags: DIFlagStaticMember) +// CHECK-NOT: name: "FLOATS",{{.*}}extraData: +// CHECK-NOT: name: "DOUBLES",{{.*}}extraData: diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index baffd81b4f336..6344e4a37fcaf 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -2036,8 +2036,31 @@ DIE *DwarfUnit::getOrCreateStaticMemberDIE(const DIDerivedType *DT) { if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT->getConstant())) addConstantValue(StaticMemberDIE, CI, Ty); - if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT->getConstant())) + else if (const ConstantFP *CFP = + dyn_cast_or_null<ConstantFP>(DT->getConstant())) addConstantFPValue(StaticMemberDIE, CFP); + else if (auto *CDS = + dyn_cast_or_null<ConstantDataSequential>(DT->getConstant())) { + // Emit each element byte-by-byte in target byte order. We avoid + // getRawDataValues() because it exposes host endianness, which + // produces incorrect DWARF on big-endian hosts cross-compiling + // for little-endian targets (and vice versa). + auto *Block = new (DIEValueAllocator) DIEBlock; + unsigned NumElts = CDS->getNumElements(); + unsigned ElemByteSize = CDS->getElementType()->getPrimitiveSizeInBits() / 8; + bool IsLE = Asm->getDataLayout().isLittleEndian(); + for (unsigned I = 0; I < NumElts; ++I) { + APInt Val = CDS->getElementAsAPInt(I); + for (unsigned J = 0; J < ElemByteSize; ++J) { + unsigned BitOff = IsLE ? (J * 8) : ((ElemByteSize - 1 - J) * 8); + addUInt(*Block, dwarf::DW_FORM_data1, + Val.extractBitsAsZExtValue(8, BitOff)); + } + } + Block->computeSize(Asm->getDwarfFormParams()); + addBlock(StaticMemberDIE, dwarf::DW_AT_const_value, Block->BestForm(), + Block); + } if (uint32_t AlignInBytes = DT->getAlignInBytes()) addUInt(StaticMemberDIE, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata, diff --git a/llvm/test/DebugInfo/X86/debug-info-constexpr-array.ll b/llvm/test/DebugInfo/X86/debug-info-constexpr-array.ll new file mode 100644 index 0000000000000..fc13e4f634a59 --- /dev/null +++ b/llvm/test/DebugInfo/X86/debug-info-constexpr-array.ll @@ -0,0 +1,192 @@ +; RUN: llc -mtriple=x86_64-linux-gnu -filetype=obj %s -o %t +; RUN: llvm-dwarfdump --debug-info %t | FileCheck %s + +; Test that DW_AT_const_value is emitted for constexpr arrays of integer types +; (char, int, uint16_t, uint32_t, uint64_t, negative ints) and NOT emitted +; for 128-bit integers or floating-point arrays. +; +; Reduced from clang output for: +; using uint16_t = unsigned short; +; using uint32_t = unsigned int; +; using uint64_t = unsigned long long; +; struct Test { +; static inline constexpr char STR[] = "Hello"; +; static inline constexpr int NUMS[] = {1, 2, 3}; +; static inline constexpr uint16_t SHORTS[] = {256, 512, 1024}; +; static inline constexpr uint32_t INTS[] = {70000, 80000}; +; static inline constexpr uint64_t LONGS[] = {4294967296ULL, 123456789ULL}; +; static inline constexpr int NEG[] = {-1, -128, 42}; +; static inline constexpr __int128_t I128[] = {1, -1}; +; static inline constexpr __uint128_t U128[] = {1, 2}; +; static inline constexpr float FLOATS[] = {1.0f, 2.0f}; +; static inline constexpr double DOUBLES[] = {1.0, 2.0}; +; }; +; +; CHECK: DW_TAG_structure_type +; CHECK: DW_AT_name ("Test") + +; CHECK: DW_TAG_member +; CHECK: DW_AT_name ("STR") +; CHECK: DW_AT_const_value (<0x06> 48 65 6c 6c 6f 00 ) + +; CHECK: DW_TAG_member +; CHECK: DW_AT_name ("NUMS") +; CHECK: DW_AT_const_value (<0x0c> 01 00 00 00 02 00 00 00 03 00 00 00 ) + +; CHECK: DW_TAG_member +; CHECK: DW_AT_name ("SHORTS") +; CHECK: DW_AT_const_value (<0x06> 00 01 00 02 00 04 ) + +; CHECK: DW_TAG_member +; CHECK: DW_AT_name ("INTS") +; CHECK: DW_AT_const_value (<0x08> 70 11 01 00 80 38 01 00 ) + +; CHECK: DW_TAG_member +; CHECK: DW_AT_name ("LONGS") +; CHECK: DW_AT_const_value (<0x10> 00 00 00 00 01 00 00 00 15 cd 5b 07 00 00 00 00 ) + +; CHECK: DW_TAG_member +; CHECK: DW_AT_name ("NEG") +; CHECK: DW_AT_const_value (<0x0c> ff ff ff ff 80 ff ff ff 2a 00 00 00 ) + +; 128-bit integers: no DW_AT_const_value. +; CHECK: DW_TAG_member +; CHECK: DW_AT_name ("I128") +; CHECK-NOT: DW_AT_const_value +; CHECK: DW_TAG_member +; CHECK: DW_AT_name ("U128") +; CHECK-NOT: DW_AT_const_value + +; Floating-point arrays: no DW_AT_const_value. +; CHECK: DW_TAG_member +; CHECK: DW_AT_name ("FLOATS") +; CHECK-NOT: DW_AT_const_value + +; CHECK: DW_TAG_member +; CHECK: DW_AT_name ("DOUBLES") +; CHECK-NOT: DW_AT_const_value + +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" + +@_ZN4Test3STRE = linkonce_odr constant [6 x i8] c"Hello\00", align 1, !dbg !0 +@_ZN4Test4NUMSE = linkonce_odr constant [3 x i32] [i32 1, i32 2, i32 3], align 4, !dbg !5 +@_ZN4Test6SHORTSE = linkonce_odr constant [3 x i16] [i16 256, i16 512, i16 1024], align 2, !dbg !58 +@_ZN4Test4INTSE = linkonce_odr constant [2 x i32] [i32 70000, i32 80000], align 4, !dbg !60 +@_ZN4Test5LONGSE = linkonce_odr constant [2 x i64] [i64 4294967296, i64 123456789], align 16, !dbg !62 +@_ZN4Test3NEGE = linkonce_odr constant [3 x i32] [i32 -1, i32 -128, i32 42], align 4, !dbg !64 +@_ZN4Test4I128E = linkonce_odr constant [2 x i128] [i128 1, i128 -1], align 16, !dbg !66 +@_ZN4Test4U128E = linkonce_odr constant [2 x i128] [i128 1, i128 2], align 16, !dbg !68 +@_ZN4Test6FLOATSE = linkonce_odr constant [2 x float] [float 1.000000e+00, float 2.000000e+00], align 4, !dbg !70 +@_ZN4Test7DOUBLESE = linkonce_odr constant [2 x double] [double 1.000000e+00, double 2.000000e+00], align 16, !dbg !72 + +define dso_local void @_Z4testv() !dbg !77 { +entry: + call void @_Z3usePKv(ptr @_ZN4Test3STRE), !dbg !80 + call void @_Z3usePKv(ptr @_ZN4Test4NUMSE), !dbg !81 + call void @_Z3usePKv(ptr @_ZN4Test6SHORTSE), !dbg !82 + call void @_Z3usePKv(ptr @_ZN4Test4INTSE), !dbg !83 + call void @_Z3usePKv(ptr @_ZN4Test5LONGSE), !dbg !84 + call void @_Z3usePKv(ptr @_ZN4Test3NEGE), !dbg !85 + call void @_Z3usePKv(ptr @_ZN4Test4I128E), !dbg !86 + call void @_Z3usePKv(ptr @_ZN4Test4U128E), !dbg !87 + call void @_Z3usePKv(ptr @_ZN4Test6FLOATSE), !dbg !88 + call void @_Z3usePKv(ptr @_ZN4Test7DOUBLESE), !dbg !89 + ret void, !dbg !90 +} + +declare void @_Z3usePKv(ptr) + +!llvm.dbg.cu = !{!2} +!llvm.module.flags = !{!74, !75} + +!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) +!1 = distinct !DIGlobalVariable(name: "STR", linkageName: "_ZN4Test3STRE", scope: !2, file: !7, line: 9, type: !17, isLocal: false, isDefinition: true, declaration: !16) +!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !3, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, globals: !4, splitDebugInlining: false, nameTableKind: None) +!3 = !DIFile(filename: "test.cpp", directory: "/tmp") +!4 = !{!0, !5, !58, !60, !62, !64, !66, !68, !70, !72} +!5 = !DIGlobalVariableExpression(var: !6, expr: !DIExpression()) +!6 = distinct !DIGlobalVariable(name: "NUMS", linkageName: "_ZN4Test4NUMSE", scope: !2, file: !7, line: 10, type: !8, isLocal: false, isDefinition: true, declaration: !13) +!7 = !DIFile(filename: "test.cpp", directory: "/tmp") +!8 = !DICompositeType(tag: DW_TAG_array_type, baseType: !9, size: 96, elements: !11) +!9 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !10) +!10 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!11 = !{!12} +!12 = !DISubrange(count: 3) +!13 = !DIDerivedType(tag: DW_TAG_member, name: "NUMS", scope: !14, file: !7, line: 10, baseType: !8, flags: DIFlagStaticMember, extraData: [3 x i32] [i32 1, i32 2, i32 3]) +!14 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "Test", file: !7, line: 8, size: 8, flags: DIFlagTypePassByValue, elements: !15, identifier: "_ZTS4Test") +!15 = !{!16, !13, !22, !27, !34, !39, !40, !45, !50, !54} +!16 = !DIDerivedType(tag: DW_TAG_member, name: "STR", scope: !14, file: !7, line: 9, baseType: !17, flags: DIFlagStaticMember, extraData: [6 x i8] c"Hello\00") +!17 = !DICompositeType(tag: DW_TAG_array_type, baseType: !18, size: 48, elements: !20) +!18 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !19) +!19 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char) +!20 = !{!21} +!21 = !DISubrange(count: 6) +!22 = !DIDerivedType(tag: DW_TAG_member, name: "SHORTS", scope: !14, file: !7, line: 11, baseType: !23, flags: DIFlagStaticMember, extraData: [3 x i16] [i16 256, i16 512, i16 1024]) +!23 = !DICompositeType(tag: DW_TAG_array_type, baseType: !24, size: 48, elements: !11) +!24 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !25) +!25 = !DIDerivedType(tag: DW_TAG_typedef, name: "uint16_t", file: !7, line: 4, baseType: !26) +!26 = !DIBasicType(name: "unsigned short", size: 16, encoding: DW_ATE_unsigned) +!27 = !DIDerivedType(tag: DW_TAG_member, name: "INTS", scope: !14, file: !7, line: 12, baseType: !28, flags: DIFlagStaticMember, extraData: [2 x i32] [i32 70000, i32 80000]) +!28 = !DICompositeType(tag: DW_TAG_array_type, baseType: !29, size: 64, elements: !32) +!29 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !30) +!30 = !DIDerivedType(tag: DW_TAG_typedef, name: "uint32_t", file: !7, line: 5, baseType: !31) +!31 = !DIBasicType(name: "unsigned int", size: 32, encoding: DW_ATE_unsigned) +!32 = !{!33} +!33 = !DISubrange(count: 2) +!34 = !DIDerivedType(tag: DW_TAG_member, name: "LONGS", scope: !14, file: !7, line: 13, baseType: !35, flags: DIFlagStaticMember, extraData: [2 x i64] [i64 4294967296, i64 123456789]) +!35 = !DICompositeType(tag: DW_TAG_array_type, baseType: !36, size: 128, elements: !32) +!36 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !37) +!37 = !DIDerivedType(tag: DW_TAG_typedef, name: "uint64_t", file: !7, line: 6, baseType: !38) +!38 = !DIBasicType(name: "unsigned long long", size: 64, encoding: DW_ATE_unsigned) +!39 = !DIDerivedType(tag: DW_TAG_member, name: "NEG", scope: !14, file: !7, line: 14, baseType: !8, flags: DIFlagStaticMember, extraData: [3 x i32] [i32 -1, i32 -128, i32 42]) +!40 = !DIDerivedType(tag: DW_TAG_member, name: "I128", scope: !14, file: !7, line: 17, baseType: !41, flags: DIFlagStaticMember) +!41 = !DICompositeType(tag: DW_TAG_array_type, baseType: !42, size: 256, elements: !32) +!42 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !43) +!43 = !DIDerivedType(tag: DW_TAG_typedef, name: "__int128_t", file: !3, baseType: !44) +!44 = !DIBasicType(name: "__int128", size: 128, encoding: DW_ATE_signed) +!45 = !DIDerivedType(tag: DW_TAG_member, name: "U128", scope: !14, file: !7, line: 18, baseType: !46, flags: DIFlagStaticMember) +!46 = !DICompositeType(tag: DW_TAG_array_type, baseType: !47, size: 256, elements: !32) +!47 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !48) +!48 = !DIDerivedType(tag: DW_TAG_typedef, name: "__uint128_t", file: !3, baseType: !49) +!49 = !DIBasicType(name: "unsigned __int128", size: 128, encoding: DW_ATE_unsigned) +!50 = !DIDerivedType(tag: DW_TAG_member, name: "FLOATS", scope: !14, file: !7, line: 19, baseType: !51, flags: DIFlagStaticMember) +!51 = !DICompositeType(tag: DW_TAG_array_type, baseType: !52, size: 64, elements: !32) +!52 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !53) +!53 = !DIBasicType(name: "float", size: 32, encoding: DW_ATE_float) +!54 = !DIDerivedType(tag: DW_TAG_member, name: "DOUBLES", scope: !14, file: !7, line: 20, baseType: !55, flags: DIFlagStaticMember) +!55 = !DICompositeType(tag: DW_TAG_array_type, baseType: !56, size: 128, elements: !32) +!56 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !57) +!57 = !DIBasicType(name: "double", size: 64, encoding: DW_ATE_float) +!58 = !DIGlobalVariableExpression(var: !59, expr: !DIExpression()) +!59 = distinct !DIGlobalVariable(name: "SHORTS", linkageName: "_ZN4Test6SHORTSE", scope: !2, file: !7, line: 11, type: !23, isLocal: false, isDefinition: true, declaration: !22) +!60 = !DIGlobalVariableExpression(var: !61, expr: !DIExpression()) +!61 = distinct !DIGlobalVariable(name: "INTS", linkageName: "_ZN4Test4INTSE", scope: !2, file: !7, line: 12, type: !28, isLocal: false, isDefinition: true, declaration: !27) +!62 = !DIGlobalVariableExpression(var: !63, expr: !DIExpression()) +!63 = distinct !DIGlobalVariable(name: "LONGS", linkageName: "_ZN4Test5LONGSE", scope: !2, file: !7, line: 13, type: !35, isLocal: false, isDefinition: true, declaration: !34) +!64 = !DIGlobalVariableExpression(var: !65, expr: !DIExpression()) +!65 = distinct !DIGlobalVariable(name: "NEG", linkageName: "_ZN4Test3NEGE", scope: !2, file: !7, line: 14, type: !8, isLocal: false, isDefinition: true, declaration: !39) +!66 = !DIGlobalVariableExpression(var: !67, expr: !DIExpression()) +!67 = distinct !DIGlobalVariable(name: "I128", linkageName: "_ZN4Test4I128E", scope: !2, file: !7, line: 17, type: !41, isLocal: false, isDefinition: true, declaration: !40) +!68 = !DIGlobalVariableExpression(var: !69, expr: !DIExpression()) +!69 = distinct !DIGlobalVariable(name: "U128", linkageName: "_ZN4Test4U128E", scope: !2, file: !7, line: 18, type: !46, isLocal: false, isDefinition: true, declaration: !45) +!70 = !DIGlobalVariableExpression(var: !71, expr: !DIExpression()) +!71 = distinct !DIGlobalVariable(name: "FLOATS", linkageName: "_ZN4Test6FLOATSE", scope: !2, file: !7, line: 19, type: !51, isLocal: false, isDefinition: true, declaration: !50) +!72 = !DIGlobalVariableExpression(var: !73, expr: !DIExpression()) +!73 = distinct !DIGlobalVariable(name: "DOUBLES", linkageName: "_ZN4Test7DOUBLESE", scope: !2, file: !7, line: 20, type: !55, isLocal: false, isDefinition: true, declaration: !54) +!74 = !{i32 2, !"Debug Info Version", i32 3} +!75 = !{i32 1, !"wchar_size", i32 4} +!77 = distinct !DISubprogram(name: "test", linkageName: "_Z4testv", scope: !7, file: !7, line: 24, type: !78, scopeLine: 24, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !2) +!78 = !DISubroutineType(types: !79) +!79 = !{null} +!80 = !DILocation(line: 25, column: 3, scope: !77) +!81 = !DILocation(line: 26, column: 3, scope: !77) +!82 = !DILocation(line: 27, column: 3, scope: !77) +!83 = !DILocation(line: 28, column: 3, scope: !77) +!84 = !DILocation(line: 29, column: 3, scope: !77) +!85 = !DILocation(line: 30, column: 3, scope: !77) +!86 = !DILocation(line: 31, column: 3, scope: !77) +!87 = !DILocation(line: 32, column: 3, scope: !77) +!88 = !DILocation(line: 33, column: 3, scope: !77) +!89 = !DILocation(line: 34, column: 3, scope: !77) +!90 = !DILocation(line: 35, column: 1, scope: !77) `````````` </details> https://github.com/llvm/llvm-project/pull/184804 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
