From 8831ef7a16424e8584f807567c470f8f1ef46891 Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Fri, 2 Nov 2018 13:47:47 +0000 Subject: [PATCH] [DEBUGINFO, NVPTX]DO not emit ',debug' option if no debug info or only debug directives are requested. Summary: If the output of debug directives only is requested, we should drop emission of ',debug' option from the target directive. Required for supporting of nvprof profiler. Reviewers: probinson, echristo, dblaikie Subscribers: Hahnfeld, jholewinski, llvm-commits, JDevlieghere, aprantl Differential Revision: https://reviews.llvm.org/D46061 llvm-svn: 345972 --- .../NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp | 10 +++-- .../NVPTX/MCTargetDesc/NVPTXTargetStreamer.h | 3 ++ llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp | 21 +++++++++- llvm/test/DebugInfo/NVPTX/debug-file-loc-only.ll | 48 ++++++++++++++++++++++ 4 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 llvm/test/DebugInfo/NVPTX/debug-file-loc-only.ll diff --git a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp index 71ca7a5..f7b4cf3 100644 --- a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp +++ b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp @@ -25,6 +25,12 @@ NVPTXTargetStreamer::NVPTXTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {} NVPTXTargetStreamer::~NVPTXTargetStreamer() = default; +void NVPTXTargetStreamer::outputDwarfFileDirectives() { + for (const std::string &S : DwarfFiles) + getStreamer().EmitRawText(S.data()); + DwarfFiles.clear(); +} + void NVPTXTargetStreamer::emitDwarfFileDirective(StringRef Directive) { DwarfFiles.emplace_back(Directive); } @@ -82,9 +88,7 @@ void NVPTXTargetStreamer::changeSection(const MCSection *CurSection, OS << "//\t}\n"; if (isDwarfSection(FI, Section)) { // Emit DWARF .file directives in the outermost scope. - for (const std::string &S : DwarfFiles) - getStreamer().EmitRawText(S.data()); - DwarfFiles.clear(); + outputDwarfFileDirectives(); OS << "//\t.section"; Section->PrintSwitchToSection(*getStreamer().getContext().getAsmInfo(), FI->getTargetTriple(), OS, SubSection); diff --git a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.h b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.h index 34391a8..f18e61c 100644 --- a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.h +++ b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.h @@ -24,6 +24,9 @@ public: NVPTXTargetStreamer(MCStreamer &S); ~NVPTXTargetStreamer() override; + /// Outputs the list of the DWARF '.file' directives to the streamer. + void outputDwarfFileDirectives(); + /// Record DWARF file directives for later output. /// According to PTX ISA, CUDA Toolkit documentation, 11.5.3. Debugging /// Directives: .file diff --git a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp index a966b99..9d9c75a 100644 --- a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp @@ -16,6 +16,7 @@ #include "InstPrinter/NVPTXInstPrinter.h" #include "MCTargetDesc/NVPTXBaseInfo.h" #include "MCTargetDesc/NVPTXMCAsmInfo.h" +#include "MCTargetDesc/NVPTXTargetStreamer.h" #include "NVPTX.h" #include "NVPTXMCExpr.h" #include "NVPTXMachineFunctionInfo.h" @@ -880,8 +881,22 @@ void NVPTXAsmPrinter::emitHeader(Module &M, raw_ostream &O, if (NTM.getDrvInterface() == NVPTX::NVCL) O << ", texmode_independent"; + bool HasFullDebugInfo = false; + for (DICompileUnit *CU : M.debug_compile_units()) { + switch(CU->getEmissionKind()) { + case DICompileUnit::NoDebug: + case DICompileUnit::DebugDirectivesOnly: + break; + case DICompileUnit::LineTablesOnly: + case DICompileUnit::FullDebug: + HasFullDebugInfo = true; + break; + } + if (HasFullDebugInfo) + break; + } // FIXME: remove comment once debug info is properly supported. - if (MMI && MMI->hasDebugInfo()) + if (MMI && MMI->hasDebugInfo() && HasFullDebugInfo) O << "//, debug"; O << "\n"; @@ -938,6 +953,10 @@ bool NVPTXAsmPrinter::doFinalization(Module &M) { if (HasDebugInfo) OutStreamer->EmitRawText("//\t}"); + // Output last DWARF .file directives, if any. + static_cast(OutStreamer->getTargetStreamer()) + ->outputDwarfFileDirectives(); + return ret; //bool Result = AsmPrinter::doFinalization(M); diff --git a/llvm/test/DebugInfo/NVPTX/debug-file-loc-only.ll b/llvm/test/DebugInfo/NVPTX/debug-file-loc-only.ll new file mode 100644 index 0000000..389a7c6 --- /dev/null +++ b/llvm/test/DebugInfo/NVPTX/debug-file-loc-only.ll @@ -0,0 +1,48 @@ +; RUN: llc < %s -mtriple=nvptx64-nvidia-cuda | FileCheck %s + +; // Bitcode int this test case is reduced version of compiled code below: +;extern "C" { +;#line 1 "/source/dir/foo.h" +;__device__ void foo() {} +;#line 2 "/source/dir/bar.cu" +;__device__ void bar() {} +;} + +; CHECK: .target sm_{{[0-9]+$}} + +; CHECK: .visible .func foo() +; CHECK: .loc [[FOO:[0-9]+]] 1 31 +; CHECK: ret; +; CHECK: .visible .func bar() +; CHECK: .loc [[BAR:[0-9]+]] 2 31 +; CHECK: ret; + +define void @foo() !dbg !4 { +bb: + ret void, !dbg !10 +} + +define void @bar() !dbg !7 { +bb: + ret void, !dbg !11 +} + +; CHECK-DAG: .file [[FOO]] "{{.*}}foo.h" +; CHECK-DAG: .file [[BAR]] "{{.*}}bar.cu" + +; CHECK-NOT: .section .debug{{.*}} + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!8, !9} + +!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "", isOptimized: false, runtimeVersion: 0, emissionKind: DebugDirectivesOnly, enums: !2) +!1 = !DIFile(filename: "bar.cu", directory: "/source/dir") +!2 = !{} +!4 = distinct !DISubprogram(name: "foo", scope: !5, file: !5, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2) +!5 = !DIFile(filename: "foo.h", directory: "/source/dir") +!6 = !DISubroutineType(types: !2) +!7 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 2, type: !6, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2) +!8 = !{i32 2, !"Dwarf Version", i32 2} +!9 = !{i32 2, !"Debug Info Version", i32 3} +!10 = !DILocation(line: 1, column: 31, scope: !4) +!11 = !DILocation(line: 2, column: 31, scope: !7) -- 2.7.4