diff options
| author | Alexey Bataev <a.bataev@hotmail.com> | 2018-04-03 17:28:55 +0000 |
|---|---|---|
| committer | Alexey Bataev <a.bataev@hotmail.com> | 2018-04-03 17:28:55 +0000 |
| commit | f7226ed67d2212d72af99f600c7df882d4b1f826 (patch) | |
| tree | c9a21eff2ebf6b8df3acc03f0638b87faa225a1a /llvm | |
| parent | 8c63bafdd369d178456b1c57e5c4741fc7673443 (diff) | |
| download | bcm5719-llvm-f7226ed67d2212d72af99f600c7df882d4b1f826.tar.gz bcm5719-llvm-f7226ed67d2212d72af99f600c7df882d4b1f826.zip | |
[DEBUGINFO] Add option that allows to disable emission of flags in .loc directives.
Summary:
Some targets do not support extended format of .loc directive and
support only simple format: .loc <FileID> <Line> <Column>. Patch adds
MCAsmInfo flag and option that allows emit .loc directive without
additional flags.
Reviewers: echristo
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D45184
llvm-svn: 329089
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/MC/MCAsmInfo.h | 7 | ||||
| -rw-r--r-- | llvm/lib/MC/MCAsmInfo.cpp | 11 | ||||
| -rw-r--r-- | llvm/lib/MC/MCAsmStreamer.cpp | 40 | ||||
| -rw-r--r-- | llvm/test/DebugInfo/Generic/extended-loc-directive.ll | 73 |
4 files changed, 112 insertions, 19 deletions
diff --git a/llvm/include/llvm/MC/MCAsmInfo.h b/llvm/include/llvm/MC/MCAsmInfo.h index c538c46fc07..cb34fe3699c 100644 --- a/llvm/include/llvm/MC/MCAsmInfo.h +++ b/llvm/include/llvm/MC/MCAsmInfo.h @@ -344,6 +344,10 @@ protected: /// For example, foo(plt) instead of foo@plt. Defaults to false. bool UseParensForSymbolVariant = false; + /// True if the target supports flags in ".loc" directive, false if only + /// location is allowed. + bool SupportsExtendedDwarfLocDirective = true; + //===--- Prologue State ----------------------------------------------===// std::vector<MCCFIInstruction> InitialFrameState; @@ -579,6 +583,9 @@ public: bool doDwarfFDESymbolsUseAbsDiff() const { return DwarfFDESymbolsUseAbsDiff; } bool useDwarfRegNumForCFI() const { return DwarfRegNumForCFI; } bool useParensForSymbolVariant() const { return UseParensForSymbolVariant; } + bool supportsExtendedDwarfLocDirective() const { + return SupportsExtendedDwarfLocDirective; + } void addInitialFrameState(const MCCFIInstruction &Inst) { InitialFrameState.push_back(Inst); diff --git a/llvm/lib/MC/MCAsmInfo.cpp b/llvm/lib/MC/MCAsmInfo.cpp index f05904048e0..30f22d2d68f 100644 --- a/llvm/lib/MC/MCAsmInfo.cpp +++ b/llvm/lib/MC/MCAsmInfo.cpp @@ -17,9 +17,18 @@ #include "llvm/MC/MCContext.h" #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCStreamer.h" +#include "llvm/Support/CommandLine.h" using namespace llvm; +enum DefaultOnOff { Default, Enable, Disable }; +static cl::opt<DefaultOnOff> DwarfExtendedLoc( + "dwarf-extended-loc", cl::Hidden, + cl::desc("Disable emission of the extended flags in .loc directives."), + cl::values(clEnumVal(Default, "Default for platform"), + clEnumVal(Enable, "Enabled"), clEnumVal(Disable, "Disabled")), + cl::init(Default)); + MCAsmInfo::MCAsmInfo() { SeparatorString = ";"; CommentString = "#"; @@ -41,6 +50,8 @@ MCAsmInfo::MCAsmInfo() { Data64bitsDirective = "\t.quad\t"; GlobalDirective = "\t.globl\t"; WeakDirective = "\t.weak\t"; + if (DwarfExtendedLoc != Default) + SupportsExtendedDwarfLocDirective = DwarfExtendedLoc == Enable; // FIXME: Clang's logic should be synced with the logic used to initialize // this member and the two implementations should be merged. diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp index c1d74a0e94a..01e1744b134 100644 --- a/llvm/lib/MC/MCAsmStreamer.cpp +++ b/llvm/lib/MC/MCAsmStreamer.cpp @@ -1171,28 +1171,30 @@ void MCAsmStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line, unsigned Discriminator, StringRef FileName) { OS << "\t.loc\t" << FileNo << " " << Line << " " << Column; - if (Flags & DWARF2_FLAG_BASIC_BLOCK) - OS << " basic_block"; - if (Flags & DWARF2_FLAG_PROLOGUE_END) - OS << " prologue_end"; - if (Flags & DWARF2_FLAG_EPILOGUE_BEGIN) - OS << " epilogue_begin"; - - unsigned OldFlags = getContext().getCurrentDwarfLoc().getFlags(); - if ((Flags & DWARF2_FLAG_IS_STMT) != (OldFlags & DWARF2_FLAG_IS_STMT)) { - OS << " is_stmt "; + if (MAI->supportsExtendedDwarfLocDirective()) { + if (Flags & DWARF2_FLAG_BASIC_BLOCK) + OS << " basic_block"; + if (Flags & DWARF2_FLAG_PROLOGUE_END) + OS << " prologue_end"; + if (Flags & DWARF2_FLAG_EPILOGUE_BEGIN) + OS << " epilogue_begin"; + + unsigned OldFlags = getContext().getCurrentDwarfLoc().getFlags(); + if ((Flags & DWARF2_FLAG_IS_STMT) != (OldFlags & DWARF2_FLAG_IS_STMT)) { + OS << " is_stmt "; + + if (Flags & DWARF2_FLAG_IS_STMT) + OS << "1"; + else + OS << "0"; + } - if (Flags & DWARF2_FLAG_IS_STMT) - OS << "1"; - else - OS << "0"; + if (Isa) + OS << " isa " << Isa; + if (Discriminator) + OS << " discriminator " << Discriminator; } - if (Isa) - OS << " isa " << Isa; - if (Discriminator) - OS << " discriminator " << Discriminator; - if (IsVerboseAsm) { OS.PadToColumn(MAI->getCommentColumn()); OS << MAI->getCommentString() << ' ' << FileName << ':' diff --git a/llvm/test/DebugInfo/Generic/extended-loc-directive.ll b/llvm/test/DebugInfo/Generic/extended-loc-directive.ll new file mode 100644 index 00000000000..2ffa7c6f91d --- /dev/null +++ b/llvm/test/DebugInfo/Generic/extended-loc-directive.ll @@ -0,0 +1,73 @@ +; RUN: llc -filetype=asm -asm-verbose=0 -O0 -dwarf-extended-loc=Enable < %s | FileCheck %s --check-prefix ENABLED --check-prefix CHECK +; RUN: llc -filetype=asm -asm-verbose=0 -O0 -dwarf-extended-loc=Disable < %s | FileCheck %s --check-prefix DISABLED --check-prefix CHECK + +; Check that the assembly output properly handles is_stmt changes. And since +; we're testing anyway, check the integrated assembler too. + +; Generated with clang from multiline.c: +; void f1(); +; void f2() { +; f1(); f1(); f1(); +; f1(); f1(); f1(); +; } + + +; CHECK: .loc 1 2 0{{$}} +; CHECK-NOT: .loc{{ }} +; ENABLED: .loc 1 3 3 prologue_end{{$}} +; DISABLED: .loc 1 3 3{{$}} +; CHECK-NOT: .loc +; ENABLED: .loc 1 3 9 is_stmt 0{{$}} +; DISABLED: .loc 1 3 9{{$}} +; CHECK-NOT: .loc +; CHECK: .loc 1 3 15{{$}} +; CHECK-NOT: .loc +; ENABLED: .loc 1 4 3 is_stmt 1{{$}} +; DISABLED: .loc 1 4 3{{$}} +; CHECK-NOT: .loc +; ENABLED: .loc 1 4 9 is_stmt 0{{$}} +; DISABLED: .loc 1 4 9{{$}} +; CHECK-NOT: .loc +; CHECK: .loc 1 4 15{{$}} +; CHECK-NOT: .loc +; ENABLED: .loc 1 5 1 is_stmt 1{{$}} +; DISABLED: .loc 1 5 1{{$}} + +; Function Attrs: nounwind uwtable +define void @f2() #0 !dbg !4 { +entry: + call void (...) @f1(), !dbg !11 + call void (...) @f1(), !dbg !12 + call void (...) @f1(), !dbg !13 + call void (...) @f1(), !dbg !14 + call void (...) @f1(), !dbg !15 + call void (...) @f1(), !dbg !16 + ret void, !dbg !17 +} + +declare void @f1(...) #1 + +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!8, !9} +!llvm.ident = !{!10} + +!0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 3.6.0 (trunk 225000) (llvm/trunk 224999)", isOptimized: false, emissionKind: FullDebug, file: !1, enums: !2, retainedTypes: !2, globals: !2, imports: !2) +!1 = !DIFile(filename: "multiline.c", directory: "/tmp/dbginfo") +!2 = !{} +!4 = distinct !DISubprogram(name: "f2", line: 2, isLocal: false, isDefinition: true, isOptimized: false, unit: !0, scopeLine: 2, file: !1, scope: !5, type: !6, variables: !2) +!5 = !DIFile(filename: "multiline.c", directory: "/tmp/dbginfo") +!6 = !DISubroutineType(types: !7) +!7 = !{null} +!8 = !{i32 2, !"Dwarf Version", i32 4} +!9 = !{i32 2, !"Debug Info Version", i32 3} +!10 = !{!"clang version 3.6.0 (trunk 225000) (llvm/trunk 224999)"} +!11 = !DILocation(line: 3, column: 3, scope: !4) +!12 = !DILocation(line: 3, column: 9, scope: !4) +!13 = !DILocation(line: 3, column: 15, scope: !4) +!14 = !DILocation(line: 4, column: 3, scope: !4) +!15 = !DILocation(line: 4, column: 9, scope: !4) +!16 = !DILocation(line: 4, column: 15, scope: !4) +!17 = !DILocation(line: 5, column: 1, scope: !4) |

