From 38a61873963f94ce0da04c37ad58358b60242e55 Mon Sep 17 00:00:00 2001 From: Petar Jovanovic Date: Tue, 19 Mar 2019 13:49:03 +0000 Subject: [PATCH] [DebugInfoMetadata] Move main subprogram DIFlag into DISPFlags Moving subprogram specific flags into DISPFlags makes IR code more readable. In addition, we provide free space in DIFlags for other 'non-subprogram-specific' debug info flags. Patch by Djordje Todorovic. Differential Revision: https://reviews.llvm.org/D59288 llvm-svn: 356454 --- llvm/include/llvm-c/DebugInfo.h | 1 - llvm/include/llvm/IR/DebugInfoFlags.def | 4 +-- llvm/include/llvm/IR/DebugInfoMetadata.h | 8 +++-- llvm/lib/Bitcode/Reader/MetadataLoader.cpp | 35 ++++++++++++++++----- llvm/test/Bitcode/DISubprogram-v5.ll | 24 ++++++++++++++ llvm/test/Bitcode/DISubprogram-v5.ll.bc | Bin 0 -> 1300 bytes .../DebugInfo/Generic/containing-type-extension.ll | 2 +- llvm/test/DebugInfo/Generic/discriminated-union.ll | 2 +- llvm/test/DebugInfo/Generic/mainsubprogram.ll | 2 +- .../Generic/univariant-discriminated-union.ll | 2 +- .../X86/containing-type-extension-rust.ll | 2 +- 11 files changed, 64 insertions(+), 18 deletions(-) create mode 100644 llvm/test/Bitcode/DISubprogram-v5.ll create mode 100755 llvm/test/Bitcode/DISubprogram-v5.ll.bc diff --git a/llvm/include/llvm-c/DebugInfo.h b/llvm/include/llvm-c/DebugInfo.h index b4c9b65..90978ac 100644 --- a/llvm/include/llvm-c/DebugInfo.h +++ b/llvm/include/llvm-c/DebugInfo.h @@ -50,7 +50,6 @@ typedef enum { LLVMDIFlagIntroducedVirtual = 1 << 18, LLVMDIFlagBitField = 1 << 19, LLVMDIFlagNoReturn = 1 << 20, - LLVMDIFlagMainSubprogram = 1 << 21, LLVMDIFlagTypePassByValue = 1 << 22, LLVMDIFlagTypePassByReference = 1 << 23, LLVMDIFlagEnumClass = 1 << 24, diff --git a/llvm/include/llvm/IR/DebugInfoFlags.def b/llvm/include/llvm/IR/DebugInfoFlags.def index c190124..5bb8c93 100644 --- a/llvm/include/llvm/IR/DebugInfoFlags.def +++ b/llvm/include/llvm/IR/DebugInfoFlags.def @@ -50,7 +50,6 @@ HANDLE_DI_FLAG((3 << 16), VirtualInheritance) HANDLE_DI_FLAG((1 << 18), IntroducedVirtual) HANDLE_DI_FLAG((1 << 19), BitField) HANDLE_DI_FLAG((1 << 20), NoReturn) -HANDLE_DI_FLAG((1 << 21), MainSubprogram) HANDLE_DI_FLAG((1 << 22), TypePassByValue) HANDLE_DI_FLAG((1 << 23), TypePassByReference) HANDLE_DI_FLAG((1 << 24), EnumClass) @@ -88,11 +87,12 @@ HANDLE_DISP_FLAG((1u << 4), Optimized) HANDLE_DISP_FLAG((1u << 5), Pure) HANDLE_DISP_FLAG((1u << 6), Elemental) HANDLE_DISP_FLAG((1u << 7), Recursive) +HANDLE_DISP_FLAG((1u << 8), MainSubprogram) #ifdef DISP_FLAG_LARGEST_NEEDED // Intended to be used with ADT/BitmaskEnum.h. // NOTE: Always must be equal to largest flag, check this when adding new flags. -HANDLE_DISP_FLAG((1 << 7), Largest) +HANDLE_DISP_FLAG((1 << 8), Largest) #undef DISP_FLAG_LARGEST_NEEDED #endif diff --git a/llvm/include/llvm/IR/DebugInfoMetadata.h b/llvm/include/llvm/IR/DebugInfoMetadata.h index 8448b67..7b40ee0 100644 --- a/llvm/include/llvm/IR/DebugInfoMetadata.h +++ b/llvm/include/llvm/IR/DebugInfoMetadata.h @@ -1675,7 +1675,8 @@ public: // Helper for converting old bitfields to new flags word. static DISPFlags toSPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized, - unsigned Virtuality = SPFlagNonvirtual) { + unsigned Virtuality = SPFlagNonvirtual, + bool IsMainSubprogram = false) { // We're assuming virtuality is the low-order field. static_assert( int(SPFlagVirtual) == int(dwarf::DW_VIRTUALITY_virtual) && @@ -1685,7 +1686,8 @@ public: (Virtuality & SPFlagVirtuality) | (IsLocalToUnit ? SPFlagLocalToUnit : SPFlagZero) | (IsDefinition ? SPFlagDefinition : SPFlagZero) | - (IsOptimized ? SPFlagOptimized : SPFlagZero)); + (IsOptimized ? SPFlagOptimized : SPFlagZero) | + (IsMainSubprogram ? SPFlagMainSubprogram : SPFlagZero)); } private: @@ -1784,6 +1786,7 @@ public: bool isLocalToUnit() const { return getSPFlags() & SPFlagLocalToUnit; } bool isDefinition() const { return getSPFlags() & SPFlagDefinition; } bool isOptimized() const { return getSPFlags() & SPFlagOptimized; } + bool isMainSubprogram() const { return getSPFlags() & SPFlagMainSubprogram; } bool isArtificial() const { return getFlags() & FlagArtificial; } bool isPrivate() const { @@ -1800,7 +1803,6 @@ public: bool areAllCallsDescribed() const { return getFlags() & FlagAllCallsDescribed; } - bool isMainSubprogram() const { return getFlags() & FlagMainSubprogram; } bool isPure() const { return getSPFlags() & SPFlagPure; } bool isElemental() const { return getSPFlags() & SPFlagElemental; } bool isRecursive() const { return getSPFlags() & SPFlagRecursive; } diff --git a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp index f6b2610..089038c 100644 --- a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp +++ b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp @@ -1406,12 +1406,33 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( return error("Invalid record"); bool HasSPFlags = Record[0] & 4; - DISubprogram::DISPFlags SPFlags = - HasSPFlags - ? static_cast(Record[9]) - : DISubprogram::toSPFlags( - /*IsLocalToUnit=*/Record[7], /*IsDefinition=*/Record[8], - /*IsOptimized=*/Record[14], /*Virtuality=*/Record[11]); + + DINode::DIFlags Flags; + DISubprogram::DISPFlags SPFlags; + if (!HasSPFlags) + Flags = static_cast(Record[11 + 2]); + else { + Flags = static_cast(Record[11]); + SPFlags = static_cast(Record[9]); + } + + // Support for old metadata when + // subprogram specific flags are placed in DIFlags. + const unsigned DIFlagMainSubprogram = 1 << 21; + bool HasOldMainSubprogramFlag = Flags & DIFlagMainSubprogram; + if (HasOldMainSubprogramFlag) + // Remove old DIFlagMainSubprogram from DIFlags. + // Note: This assumes that any future use of bit 21 defaults to it + // being 0. + Flags &= ~static_cast(DIFlagMainSubprogram); + + if (HasOldMainSubprogramFlag && HasSPFlags) + SPFlags |= DISubprogram::SPFlagMainSubprogram; + else if (!HasSPFlags) + SPFlags = DISubprogram::toSPFlags( + /*IsLocalToUnit=*/Record[7], /*IsDefinition=*/Record[8], + /*IsOptimized=*/Record[14], /*Virtuality=*/Record[11], + /*DIFlagMainSubprogram*/HasOldMainSubprogramFlag); // All definitions should be distinct. IsDistinct = (Record[0] & 1) || (SPFlags & DISubprogram::SPFlagDefinition); @@ -1455,7 +1476,7 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( getDITypeRefOrNull(Record[8 + OffsetA]), // containingType Record[10 + OffsetA], // virtualIndex HasThisAdj ? Record[16 + OffsetB] : 0, // thisAdjustment - static_cast(Record[11 + OffsetA]),// flags + Flags, // flags SPFlags, // SPFlags HasUnit ? CUorFn : nullptr, // unit getMDOrNull(Record[13 + OffsetB]), // templateParams diff --git a/llvm/test/Bitcode/DISubprogram-v5.ll b/llvm/test/Bitcode/DISubprogram-v5.ll new file mode 100644 index 0000000..58e8600 --- /dev/null +++ b/llvm/test/Bitcode/DISubprogram-v5.ll @@ -0,0 +1,24 @@ + ; The .bc file was generated from this source using llvm-as from 8.0 release. + ; RUN: llvm-dis < %s.bc | FileCheck %s + +define i32 @main() !dbg !5 { +entry: + %retval = alloca i32, align 4 + store i32 0, i32* %retval + ret i32 0, !dbg !9 +} + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!3, !4} + +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 8.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !2, globals: !2, imports: !2) +!1 = !DIFile(filename: "mainsubprogram.c", directory: "/dir") +!2 = !{} +!3 = !{i32 2, !"Dwarf Version", i32 4} +!4 = !{i32 1, !"Debug Info Version", i32 3} +!5 = distinct !DISubprogram(name: "main", scope: !1, file: !1, line: 6, type: !6, scopeLine: 6, virtualIndex: 6, flags: DIFlagPrototyped | DIFlagMainSubprogram, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) +; CHECK: !5 = distinct !DISubprogram(name: "main", scope: !1, file: !1, line: 6, type: !6, scopeLine: 6, virtualIndex: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagMainSubprogram, unit: !0, retainedNodes: !2) +!6 = !DISubroutineType(types: !7) +!7 = !{!8} +!8 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed) +!9 = !DILocation(line: 7, scope: !5) diff --git a/llvm/test/Bitcode/DISubprogram-v5.ll.bc b/llvm/test/Bitcode/DISubprogram-v5.ll.bc new file mode 100755 index 0000000000000000000000000000000000000000..f3482e1c1a763c46573c6a611cd84aaa84ed88e4 GIT binary patch literal 1300 zcmX|BZ)_7~7=NzU^={jFz0O8DX)kvxkOkSe-2_|PnzdJCi!y6F>05_X_$Z_q^}> zd!KvW-}CSFNVChki~tn?5TJxDZ3lkX_T;Cx8oZdOLcmi1uVDby8Xh!g{|fqugmuDQ z)VApu(S8<7QClm>T2}jcAWrSkc+OUPf{bXik*0U5L^0hODezWrjhtcJXEnhhdC|y8 zZ>PEIm?)-9+v~Syn?A`OoZyrqvU`d{_n=vZ;`f-dpJPJ|rbK!;F~ z%~7?6_H3qd+umzh$zw2jDkstLMH9dnI&UW9=E90OWW-!)$(B+wo;Wc&LJZ~xs0W~b z#L!RUbTj2)=jSXpr_CXuqO6wOT*6&N$(6xfrIAc5LX45bXsaBF5XU3<(1;x2<7(1zOR`_aomZ326z(W(7>BxuvBSh0 zhvg`eaXFHeBVEK$Ju&o81u{Dvmp>xq0h1if$)mZ%j>jAH<9qbqv-G-v2a40?wP|yy zESLP|Mc!OUSQh=dU$T>b{`lwg>G9O;sWM~IPJNBh&PUX1|zF}vtDKjbaTbCyprRwc|^HvGE%<4Idd zapWZz3dpm0=bGe5qpgxzs6w8~!-x+_9Iq#$xx~R$hF+hg@B8S#1nb-#H@mj7>F$bU z84+l$b>x$-%gN0t#g>umCB=DV&R$fIk508fMmdykG)LK1PD)d?l~J*kvnDbV6Suun zOnuPVBzn$d`7b+}?_rZ+SB=yk?B3fQ-WeSBM?(!m-O<6`{&3@=SodJ;P@g~C!@Ynw zTchArb-4GQ>v+2Z$9lN7aH#)31gvC>Z~{mxIg2JndKbHdnhh`oC>$`L_CrGD)=cRJ zN&>g1&YGxP96x>IyBp)}>!t1s;Ysd#THSv2==6m%-Y@xXj-`lW|%wR|7&mgjMY+YFR@gD5#?l8*DJ7;x8A(uoQq ztEj!?=K$1(ds*w=fm9JcfRq8?4*`Hi>$<(gY)4f=Q$XvZ{@!qJI0oO$92$);Oi|F( zV$@btfC=snLJ$&|$vAtm0a7?Ju0?hTA9KU#4|RD9 z`!UrYtm*l^A85-@5e#quIKoAmsY}6U>hn|{AEGd-oNDmNBPyWsLFs4|xSrlvLtwYC gyD1c~i~iTWZTpS|BGLYysQ+lg(5}Y5zViS70#|LFN&o-= literal 0 HcmV?d00001 diff --git a/llvm/test/DebugInfo/Generic/containing-type-extension.ll b/llvm/test/DebugInfo/Generic/containing-type-extension.ll index 1b72aab..7e81166 100644 --- a/llvm/test/DebugInfo/Generic/containing-type-extension.ll +++ b/llvm/test/DebugInfo/Generic/containing-type-extension.ll @@ -25,7 +25,7 @@ attributes #0 = { nounwind uwtable } !0 = distinct !DICompileUnit(language: DW_LANG_Rust, producer: "clang version 3.4 (trunk 185475)", isOptimized: false, emissionKind: FullDebug, file: !1, enums: !2, retainedTypes: !2, globals: !15, imports: !2) !1 = !DIFile(filename: "CodeGen/dwarf-version.c", directory: "test") !2 = !{} -!4 = distinct !DISubprogram(name: "main", line: 6, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped | DIFlagMainSubprogram, isOptimized: false, unit: !0, scopeLine: 6, file: !1, scope: !5, type: !6, retainedNodes: !2) +!4 = distinct !DISubprogram(name: "main", line: 6, virtualIndex: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagMainSubprogram, isOptimized: false, unit: !0, scopeLine: 6, file: !1, scope: !5, type: !6, retainedNodes: !2) !5 = !DIFile(filename: "CodeGen/dwarf-version.c", directory: "test") !6 = !DISubroutineType(types: !7) !7 = !{!8} diff --git a/llvm/test/DebugInfo/Generic/discriminated-union.ll b/llvm/test/DebugInfo/Generic/discriminated-union.ll index cbe0381..5d12e13 100644 --- a/llvm/test/DebugInfo/Generic/discriminated-union.ll +++ b/llvm/test/DebugInfo/Generic/discriminated-union.ll @@ -53,7 +53,7 @@ attributes #0 = { nounwind uwtable } !2 = distinct !DICompileUnit(language: DW_LANG_Rust, file: !3, producer: "clang LLVM (rustc version 1.24.0-dev)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !4) !3 = !DIFile(filename: "e3.rs", directory: "/home/tromey/Rust") !4 = !{} -!5 = distinct !DISubprogram(name: "main", linkageName: "_ZN2e34mainE", scope: !6, file: !3, line: 2, type: !8, isLocal: true, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped | DIFlagMainSubprogram, isOptimized: false, unit: !2, templateParams: !4, retainedNodes: !4) +!5 = distinct !DISubprogram(name: "main", linkageName: "_ZN2e34mainE", scope: !6, file: !3, line: 2, type: !8, scopeLine: 2, flags: DIFlagPrototyped, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagMainSubprogram, isOptimized: false, unit: !2, templateParams: !4, retainedNodes: !4) !6 = !DINamespace(name: "e3", scope: null) !7 = !DIFile(filename: "", directory: "") !8 = !DISubroutineType(types: !9) diff --git a/llvm/test/DebugInfo/Generic/mainsubprogram.ll b/llvm/test/DebugInfo/Generic/mainsubprogram.ll index 167cced..e59b394 100644 --- a/llvm/test/DebugInfo/Generic/mainsubprogram.ll +++ b/llvm/test/DebugInfo/Generic/mainsubprogram.ll @@ -25,7 +25,7 @@ attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointe !0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 3.4 (trunk 185475)", isOptimized: false, emissionKind: FullDebug, file: !1, enums: !2, retainedTypes: !2, globals: !2, imports: !2) !1 = !DIFile(filename: "CodeGen/dwarf-version.c", directory: "test") !2 = !{} -!4 = distinct !DISubprogram(name: "main", line: 6, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped | DIFlagMainSubprogram, isOptimized: false, unit: !0, scopeLine: 6, file: !1, scope: !5, type: !6, retainedNodes: !2) +!4 = distinct !DISubprogram(name: "main", line: 6, virtualIndex: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagMainSubprogram, isOptimized: false, unit: !0, scopeLine: 6, file: !1, scope: !5, type: !6, retainedNodes: !2) !5 = !DIFile(filename: "CodeGen/dwarf-version.c", directory: "test") !6 = !DISubroutineType(types: !7) !7 = !{!8} diff --git a/llvm/test/DebugInfo/Generic/univariant-discriminated-union.ll b/llvm/test/DebugInfo/Generic/univariant-discriminated-union.ll index c68c45d..2ff475e 100644 --- a/llvm/test/DebugInfo/Generic/univariant-discriminated-union.ll +++ b/llvm/test/DebugInfo/Generic/univariant-discriminated-union.ll @@ -40,7 +40,7 @@ attributes #0 = { nounwind uwtable } !2 = distinct !DICompileUnit(language: DW_LANG_Rust, file: !3, producer: "clang LLVM (rustc version 1.24.0-dev)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !4) !3 = !DIFile(filename: "e3.rs", directory: "/home/tromey/Rust") !4 = !{} -!5 = distinct !DISubprogram(name: "main", linkageName: "_ZN2e34mainE", scope: !6, file: !3, line: 2, type: !8, isLocal: true, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped | DIFlagMainSubprogram, isOptimized: false, unit: !2, templateParams: !4, retainedNodes: !4) +!5 = distinct !DISubprogram(name: "main", linkageName: "_ZN2e34mainE", scope: !6, file: !3, line: 2, type: !8, scopeLine: 2, flags: DIFlagPrototyped, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagMainSubprogram, isOptimized: false, unit: !2, templateParams: !4, retainedNodes: !4) !6 = !DINamespace(name: "e3", scope: null) !7 = !DIFile(filename: "", directory: "") !8 = !DISubroutineType(types: !9) diff --git a/llvm/test/DebugInfo/X86/containing-type-extension-rust.ll b/llvm/test/DebugInfo/X86/containing-type-extension-rust.ll index d0cd61d..a546777 100644 --- a/llvm/test/DebugInfo/X86/containing-type-extension-rust.ll +++ b/llvm/test/DebugInfo/X86/containing-type-extension-rust.ll @@ -109,7 +109,7 @@ attributes #3 = { "no-frame-pointer-elim"="true" "probe-stack"="__rust_probestac !22 = !DIExpression() !23 = !DILocation(line: 1, scope: !11) !24 = !DILocation(line: 59, scope: !11) -!25 = distinct !DISubprogram(name: "main", linkageName: "_ZN2t24mainE", scope: !26, file: !9, line: 9, type: !27, isLocal: true, isDefinition: true, scopeLine: 9, flags: DIFlagPrototyped | DIFlagMainSubprogram, isOptimized: false, unit: !8, templateParams: !4, retainedNodes: !4) +!25 = distinct !DISubprogram(name: "main", linkageName: "_ZN2t24mainE", scope: !26, file: !9, line: 9, type: !27, scopeLine: 9, flags: DIFlagPrototyped, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagMainSubprogram, isOptimized: false, unit: !8, templateParams: !4, retainedNodes: !4) !26 = !DINamespace(name: "t2", scope: null) !27 = !DISubroutineType(types: !28) !28 = !{null} -- 2.7.4