[llvm] r204795 - Follow-up to r204790: don't try to emit line tables if there are no functions with DI in the TU

David Blaikie dblaikie at gmail.com
Wed Mar 26 08:24:07 PDT 2014


On Wed, Mar 26, 2014 at 4:24 AM, Timur Iskhodzhanov <timurrrr at google.com> wrote:
> Author: timurrrr
> Date: Wed Mar 26 06:24:36 2014
> New Revision: 204795
>
> URL: http://llvm.org/viewvc/llvm-project?rev=204795&view=rev
> Log:
> Follow-up to r204790: don't try to emit line tables if there are no functions with DI in the TU

Hmm - is there any better way to do this? Should we only be building
line tables for those functions with DI? Then we'd just emit line
tables if we have any (non-empty) line tables to emit, right?

I assume these COFF line tables don't actually get referenced from any
other debug info (since the rest of our info is DWARF), but I've been
thinking of cleaning up our other line table handling code a bit so
that it's a bit more structured - letting the line table object itself
decide whether it should be emitted (by virtue of being non-empty) and
then having line table clients (CUs in DwarfDebug - no analogy for
COFF which has no line table client) query the line table to see if
it'll be there and attach the DW_AT_stmt_list if there will be a line
table.

- David

>
> Added:
>     llvm/trunk/test/DebugInfo/COFF/asan2.ll
> Modified:
>     llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.cpp
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.cpp?rev=204795&r1=204794&r2=204795&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.cpp Wed Mar 26 06:24:36 2014
> @@ -304,11 +304,18 @@ void WinCodeViewLineTables::beginFunctio
>    }
>  }
>
> -void WinCodeViewLineTables::endFunction(const MachineFunction *) {
> +void WinCodeViewLineTables::endFunction(const MachineFunction *MF) {
>    if (!Asm || !CurFn)  // We haven't created any debug info for this function.
>      return;
>
> -  if (!CurFn->Instrs.empty()) {
> +  const Function *GV = MF->getFunction();
> +  assert(FnDebugInfo.count(GV) == true);

"count == true" seems a bit confusing for a few reasons. Should that
be either just "assert(x.count(y))" or "assert(x.count(y) != 0)" (or
greater than zero or 1 or whatever). "== true" always reads as
weird/redundant to me.

> +  assert(CurFn == &FnDebugInfo[GV]);
> +
> +  if (CurFn->Instrs.empty()) {
> +    FnDebugInfo.erase(GV);
> +    VisitedFunctions.pop_back();
> +  } else {
>      // Define end label for subprogram.
>      MCSymbol *FunctionEndSym = Asm->OutStreamer.getContext().CreateTempSymbol();
>      Asm->OutStreamer.EmitLabel(FunctionEndSym);
>
> Added: llvm/trunk/test/DebugInfo/COFF/asan2.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/asan2.ll?rev=204795&view=auto
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/COFF/asan2.ll (added)
> +++ llvm/trunk/test/DebugInfo/COFF/asan2.ll Wed Mar 26 06:24:36 2014
> @@ -0,0 +1,52 @@
> +; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -O0 < %s | FileCheck --check-prefix=X86 %s
> +
> +; This LL file was generated by running clang on the following code with
> +; -fsanitize=address
> +; D:\asan.c:
> +; 1 unsigned char c = 42;
> +
> +; Just make sure we don't try to emit the line table.
> +; X86-NOT: .section        .debug$S,"rn"
> +
> +; ModuleID = 'asan.c'
> +target datalayout = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32"
> +target triple = "i686-pc-win32"
> +
> + at c = global { i8, [63 x i8] } { i8 42, [63 x i8] zeroinitializer }, align 32
> + at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 1, void ()* @asan.module_ctor }]
> + at __asan_gen_ = private constant [7 x i8] c"asan.c\00", align 1
> + at __asan_gen_1 = private unnamed_addr constant [2 x i8] c"c\00", align 1
> + at 0 = internal global [1 x { i32, i32, i32, i32, i32, i32 }] [{ i32, i32, i32, i32, i32, i32 } { i32 ptrtoint ({ i8, [63 x i8] }* @c to i32), i32 1, i32 64, i32 ptrtoint ([2 x i8]* @__asan_gen_1 to i32), i32 ptrtoint ([7 x i8]* @__asan_gen_ to i32), i32 0 }]
> + at llvm.global_dtors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 1, void ()* @asan.module_dtor }]
> +
> +define internal void @asan.module_ctor() {
> +  call void @__asan_init_v3()
> +  call void @__asan_register_globals(i32 ptrtoint ([1 x { i32, i32, i32, i32, i32, i32 }]* @0 to i32), i32 1)
> +  ret void
> +}
> +
> +declare void @__asan_init_v3()
> +
> +declare void @__asan_before_dynamic_init(i32)
> +
> +declare void @__asan_after_dynamic_init()
> +
> +declare void @__asan_register_globals(i32, i32)
> +
> +declare void @__asan_unregister_globals(i32, i32)
> +
> +define internal void @asan.module_dtor() {
> +  call void @__asan_unregister_globals(i32 ptrtoint ([1 x { i32, i32, i32, i32, i32, i32 }]* @0 to i32), i32 1)
> +  ret void
> +}
> +
> +!llvm.dbg.cu = !{!0}
> +!llvm.module.flags = !{!3, !4}
> +!llvm.ident = !{!5}
> +
> +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !2, metadata !2, metadata !2, metadata !"", i32 2} ; [ DW_TAG_compile_unit ] [D:\/asan.c] [DW_LANG_C99]
> +!1 = metadata !{metadata !"asan.c", metadata !"D:\5C"}
> +!2 = metadata !{}
> +!3 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
> +!4 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}
> +!5 = metadata !{metadata !"clang version 3.5.0 "}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list