[llvm] r329089 - [DEBUGINFO] Add option that allows to disable emission of flags in .loc directives.

via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 5 12:18:26 PDT 2018



> -----Original Message-----
> From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On Behalf
> Of Alexey Bataev via llvm-commits
> Sent: Tuesday, April 03, 2018 1:29 PM
> To: llvm-commits at lists.llvm.org
> Subject: [llvm] r329089 - [DEBUGINFO] Add option that allows to disable
> emission of flags in .loc directives.
> 
> Author: abataev
> Date: Tue Apr  3 10:28:55 2018
> New Revision: 329089
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=329089&view=rev
> Log:
> [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
> 
> Added:
>     llvm/trunk/test/DebugInfo/Generic/extended-loc-directive.ll
> Modified:
>     llvm/trunk/include/llvm/MC/MCAsmInfo.h
>     llvm/trunk/lib/MC/MCAsmInfo.cpp
>     llvm/trunk/lib/MC/MCAsmStreamer.cpp
> 
> Modified: llvm/trunk/include/llvm/MC/MCAsmInfo.h
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/include/llvm/MC/MCAsmInfo.h?rev=329089&r1=329088&r2=329
> 089&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/include/llvm/MC/MCAsmInfo.h (original)
> +++ llvm/trunk/include/llvm/MC/MCAsmInfo.h Tue Apr  3 10:28:55 2018
> @@ -344,6 +344,10 @@ protected:
>    /// For example, foo(plt) instead of foo at 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);
> 
> Modified: llvm/trunk/lib/MC/MCAsmInfo.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/MC/MCAsmInfo.cpp?rev=329089&r1=329088&r2=329089&vie
> w=diff
> ==========================================================================
> ====
> --- llvm/trunk/lib/MC/MCAsmInfo.cpp (original)
> +++ llvm/trunk/lib/MC/MCAsmInfo.cpp Tue Apr  3 10:28:55 2018
> @@ -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.
> 
> Modified: llvm/trunk/lib/MC/MCAsmStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/MC/MCAsmStreamer.cpp?rev=329089&r1=329088&r2=329089
> &view=diff
> ==========================================================================
> ====
> --- llvm/trunk/lib/MC/MCAsmStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCAsmStreamer.cpp Tue Apr  3 10:28:55 2018
> @@ -1171,27 +1171,29 @@ void MCAsmStreamer::EmitDwarfLocDirectiv
>                                            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";
> +  if (MAI->supportsExtendedDwarfLocDirective()) {
> +    if (Flags & DWARF2_FLAG_BASIC_BLOCK)
> +      OS << " basic_block";

The basic_block flag does go all the way back to DWARF v2.
Does NVPTX really not support it?  Because I could imagine
wanting to put additional flags/options under an appropriate
version test, rather than unconditionally always emitting them.
--paulr

> +    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 ";
> +    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());
> 
> Added: llvm/trunk/test/DebugInfo/Generic/extended-loc-directive.ll
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/test/DebugInfo/Generic/extended-loc-
> directive.ll?rev=329089&view=auto
> ==========================================================================
> ====
> --- llvm/trunk/test/DebugInfo/Generic/extended-loc-directive.ll (added)
> +++ llvm/trunk/test/DebugInfo/Generic/extended-loc-directive.ll Tue Apr  3
> 10:28:55 2018
> @@ -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)
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list