[libunwind] r292722 - DWARF: allow enabling tracing at runtime

Saleem Abdulrasool via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 24 18:39:06 PST 2017


Oops.  Should be fixed in SVN r293008.

On Mon, Jan 23, 2017 at 4:01 AM, Oliver Stannard <Oliver.Stannard at arm.com>
wrote:

> Hi Saleem,
>
> This patch is causing our internal runs of the libc++ and libc++abi tests
> to fail, because logDWARF is referenced but not defined in release builds
> (with NDEBUG defined).
>
> However, I see that all of the libc++ buildbots are passing. Does this
> patch need modifying to make _LIBUNWIND_TRACE_DWARF conditional on NDEBUG,
> or is there something in the Linux environment that we might need to
> replicate in our bare-metal environment to make this work?
>
> Thanks,
> Oliver
>
> > -----Original Message-----
> > From: cfe-commits [mailto:cfe-commits-bounces at lists.llvm.org] On Behalf
> Of
> > Saleem Abdulrasool via cfe-commits
> > Sent: 21 January 2017 16:23
> > To: cfe-commits at lists.llvm.org
> > Subject: [libunwind] r292722 - DWARF: allow enabling tracing at runtime
> >
> > Author: compnerd
> > Date: Sat Jan 21 10:22:57 2017
> > New Revision: 292722
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=292722&view=rev
> > Log:
> > DWARF: allow enabling tracing at runtime
> >
> > Introduce `logDWARF` and the associated environment variable
> > `LIBUNWIND_PRINT_DWARF` to trace the CFI instructions.
> >
> > Modified:
> >     libunwind/trunk/src/DwarfParser.hpp
> >     libunwind/trunk/src/libunwind.cpp
> >
> > Modified: libunwind/trunk/src/DwarfParser.hpp
> > URL: http://llvm.org/viewvc/llvm-
> > project/libunwind/trunk/src/DwarfParser.hpp?rev=292722&r1=
> 292721&r2=292722
> > &view=diff
> > ============================================================
> ==============
> > ====
> > --- libunwind/trunk/src/DwarfParser.hpp (original)
> > +++ libunwind/trunk/src/DwarfParser.hpp Sat Jan 21 10:22:57 2017
> > @@ -23,6 +23,14 @@
> >
> >  #include "AddressSpace.hpp"
> >
> > +extern "C" bool logDWARF();
> > +
> > +#define _LIBUNWIND_TRACE_DWARF(...)
> > \
> > +  do {
> > \
> > +    if (logDWARF())
> > \
> > +      fprintf(stderr, __VA_ARGS__);
> > \
> > +  } while (0)
> > +
> >  namespace libunwind {
> >
> >  /// CFI_Parser does basic parsing of a CFI (Call Frame Information)
> > records.
> > @@ -364,13 +372,12 @@ bool CFI_Parser<A>::parseInstructions(A
> >                                        const CIE_Info &cieInfo, pint_t
> > pcoffset,
> >                                        PrologInfoStackEntry
> > *&rememberStack,
> >                                        PrologInfo *results) {
> > -  const bool logDwarf = false;
> >    pint_t p = instructions;
> >    pint_t codeOffset = 0;
> >    PrologInfo initialState = *results;
> > -  if (logDwarf)
> > -    fprintf(stderr, "parseInstructions(instructions=0x%0" PRIx64 ")\n",
> > -            (uint64_t)instructionsEnd);
> > +
> > +  _LIBUNWIND_TRACE_DWARF("parseInstructions(instructions=0x%0" PRIx64
> > ")\n",
> > +                         static_cast<uint64_t>(instructionsEnd));
> >
> >    // see DWARF Spec, section 6.4.2 for details on unwind opcodes
> >    while ((p < instructionsEnd) && (codeOffset < pcoffset)) {
> > @@ -386,35 +393,30 @@ bool CFI_Parser<A>::parseInstructions(A
> >      ++p;
> >      switch (opcode) {
> >      case DW_CFA_nop:
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_nop\n");
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_nop\n");
> >        break;
> >      case DW_CFA_set_loc:
> >        codeOffset =
> >            addressSpace.getEncodedP(p, instructionsEnd,
> > cieInfo.pointerEncoding);
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_set_loc\n");
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_set_loc\n");
> >        break;
> >      case DW_CFA_advance_loc1:
> >        codeOffset += (addressSpace.get8(p) * cieInfo.codeAlignFactor);
> >        p += 1;
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_advance_loc1: new offset=%" PRIu64 "\n",
> > -                (uint64_t)codeOffset);
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_advance_loc1: new offset=%" PRIu64
> > "\n",
> > +                             static_cast<uint64_t>(codeOffset));
> >        break;
> >      case DW_CFA_advance_loc2:
> >        codeOffset += (addressSpace.get16(p) * cieInfo.codeAlignFactor);
> >        p += 2;
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_advance_loc2: new offset=%" PRIu64 "\n",
> > -                (uint64_t)codeOffset);
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_advance_loc2: new offset=%" PRIu64
> > "\n",
> > +                             static_cast<uint64_t>(codeOffset));
> >        break;
> >      case DW_CFA_advance_loc4:
> >        codeOffset += (addressSpace.get32(p) * cieInfo.codeAlignFactor);
> >        p += 4;
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_advance_loc4: new offset=%" PRIu64 "\n",
> > -                (uint64_t)codeOffset);
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_advance_loc4: new offset=%" PRIu64
> > "\n",
> > +                             static_cast<uint64_t>(codeOffset));
> >        break;
> >      case DW_CFA_offset_extended:
> >        reg = addressSpace.getULEB128(p, instructionsEnd);
> > @@ -426,21 +428,18 @@ bool CFI_Parser<A>::parseInstructions(A
> >        }
> >        results->savedRegisters[reg].location = kRegisterInCFA;
> >        results->savedRegisters[reg].value = offset;
> > -      if (logDwarf)
> > -        fprintf(stderr,
> > -                "DW_CFA_offset_extended(reg=%" PRIu64 ", offset=%"
> PRId64
> > ")\n",
> > -                reg, offset);
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_offset_extended(reg=%" PRIu64 ", "
> > +                             "offset=%" PRId64 ")\n",
> > +                             reg, offset);
> >        break;
> >      case DW_CFA_restore_extended:
> >        reg = addressSpace.getULEB128(p, instructionsEnd);
> > -      ;
> >        if (reg > kMaxRegisterNumber) {
> >          _LIBUNWIND_LOG("malformed DWARF DW_CFA_restore_extended, reg too
> > big");
> >          return false;
> >        }
> >        results->savedRegisters[reg] = initialState.savedRegisters[reg];
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_restore_extended(reg=%" PRIu64 ")\n",
> > reg);
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_restore_extended(reg=%" PRIu64
> > ")\n", reg);
> >        break;
> >      case DW_CFA_undefined:
> >        reg = addressSpace.getULEB128(p, instructionsEnd);
> > @@ -449,8 +448,7 @@ bool CFI_Parser<A>::parseInstructions(A
> >          return false;
> >        }
> >        results->savedRegisters[reg].location = kRegisterUnused;
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_undefined(reg=%" PRIu64 ")\n", reg);
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_undefined(reg=%" PRIu64 ")\n",
> reg);
> >        break;
> >      case DW_CFA_same_value:
> >        reg = addressSpace.getULEB128(p, instructionsEnd);
> > @@ -465,8 +463,7 @@ bool CFI_Parser<A>::parseInstructions(A
> >        results->savedRegisters[reg].location = kRegisterUnused;
> >        // set flag to disable conversion to compact unwind
> >        results->sameValueUsed = true;
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_same_value(reg=%" PRIu64 ")\n", reg);
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_same_value(reg=%" PRIu64 ")\n",
> > reg);
> >        break;
> >      case DW_CFA_register:
> >        reg = addressSpace.getULEB128(p, instructionsEnd);
> > @@ -483,9 +480,8 @@ bool CFI_Parser<A>::parseInstructions(A
> >        results->savedRegisters[reg].value = (int64_t)reg2;
> >        // set flag to disable conversion to compact unwind
> >        results->registersInOtherRegisters = true;
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_register(reg=%" PRIu64 ", reg2=%" PRIu64
> > ")\n",
> > -                reg, reg2);
> > +      _LIBUNWIND_TRACE_DWARF(
> > +          "DW_CFA_register(reg=%" PRIu64 ", reg2=%" PRIu64 ")\n", reg,
> > reg2);
> >        break;
> >  #if !defined(_LIBUNWIND_NO_HEAP)
> >      case DW_CFA_remember_state:
> > @@ -498,8 +494,7 @@ bool CFI_Parser<A>::parseInstructions(A
> >        } else {
> >          return false;
> >        }
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_remember_state\n");
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_remember_state\n");
> >        break;
> >      case DW_CFA_restore_state:
> >        if (rememberStack != NULL) {
> > @@ -510,8 +505,7 @@ bool CFI_Parser<A>::parseInstructions(A
> >        } else {
> >          return false;
> >        }
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_restore_state\n");
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_restore_state\n");
> >        break;
> >  #endif
> >      case DW_CFA_def_cfa:
> > @@ -523,9 +517,8 @@ bool CFI_Parser<A>::parseInstructions(A
> >        }
> >        results->cfaRegister = (uint32_t)reg;
> >        results->cfaRegisterOffset = (int32_t)offset;
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_def_cfa(reg=%" PRIu64 ", offset=%"
> PRIu64
> > ")\n",
> > -                reg, offset);
> > +      _LIBUNWIND_TRACE_DWARF(
> > +          "DW_CFA_def_cfa(reg=%" PRIu64 ", offset=%" PRIu64 ")\n", reg,
> > offset);
> >        break;
> >      case DW_CFA_def_cfa_register:
> >        reg = addressSpace.getULEB128(p, instructionsEnd);
> > @@ -534,26 +527,23 @@ bool CFI_Parser<A>::parseInstructions(A
> >          return false;
> >        }
> >        results->cfaRegister = (uint32_t)reg;
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_def_cfa_register(%" PRIu64 ")\n", reg);
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_def_cfa_register(%" PRIu64 ")\n",
> > reg);
> >        break;
> >      case DW_CFA_def_cfa_offset:
> >        results->cfaRegisterOffset = (int32_t)
> >                                    addressSpace.getULEB128(p,
> > instructionsEnd);
> >        results->codeOffsetAtStackDecrement = (uint32_t)codeOffset;
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_def_cfa_offset(%d)\n",
> > -                results->cfaRegisterOffset);
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_def_cfa_offset(%d)\n",
> > +                             results->cfaRegisterOffset);
> >        break;
> >      case DW_CFA_def_cfa_expression:
> >        results->cfaRegister = 0;
> >        results->cfaExpression = (int64_t)p;
> >        length = addressSpace.getULEB128(p, instructionsEnd);
> >        p += length;
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_def_cfa_expression(expression=0x%"
> PRIx64
> > -                        ", length=%" PRIu64 ")\n",
> > -                results->cfaExpression, length);
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_def_cfa_expression(expression=0x%"
> > PRIx64
> > +                             ", length=%" PRIu64 ")\n",
> > +                             results->cfaExpression, length);
> >        break;
> >      case DW_CFA_expression:
> >        reg = addressSpace.getULEB128(p, instructionsEnd);
> > @@ -565,10 +555,10 @@ bool CFI_Parser<A>::parseInstructions(A
> >        results->savedRegisters[reg].value = (int64_t)p;
> >        length = addressSpace.getULEB128(p, instructionsEnd);
> >        p += length;
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_expression(reg=%" PRIu64
> > -                        ", expression=0x%" PRIx64 ", length=%" PRIu64
> > ")\n",
> > -                reg, results->savedRegisters[reg].value, length);
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_expression(reg=%" PRIu64 ", "
> > +                             "expression=0x%" PRIx64 ", "
> > +                             "length=%" PRIu64 ")\n",
> > +                             reg, results->savedRegisters[reg].value,
> > length);
> >        break;
> >      case DW_CFA_offset_extended_sf:
> >        reg = addressSpace.getULEB128(p, instructionsEnd);
> > @@ -581,10 +571,9 @@ bool CFI_Parser<A>::parseInstructions(A
> >            addressSpace.getSLEB128(p, instructionsEnd) *
> > cieInfo.dataAlignFactor;
> >        results->savedRegisters[reg].location = kRegisterInCFA;
> >        results->savedRegisters[reg].value = offset;
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_offset_extended_sf(reg=%" PRIu64
> > -                        ", offset=%" PRId64 ")\n",
> > -                reg, offset);
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_offset_extended_sf(reg=%" PRIu64
> ",
> > "
> > +                             "offset=%" PRId64 ")\n",
> > +                             reg, offset);
> >        break;
> >      case DW_CFA_def_cfa_sf:
> >        reg = addressSpace.getULEB128(p, instructionsEnd);
> > @@ -596,18 +585,16 @@ bool CFI_Parser<A>::parseInstructions(A
> >        }
> >        results->cfaRegister = (uint32_t)reg;
> >        results->cfaRegisterOffset = (int32_t)offset;
> > -      if (logDwarf)
> > -        fprintf(stderr,
> > -                "DW_CFA_def_cfa_sf(reg=%" PRIu64 ", offset=%" PRId64
> > ")\n", reg,
> > -                offset);
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_def_cfa_sf(reg=%" PRIu64 ", "
> > +                             "offset=%" PRId64 ")\n",
> > +                             reg, offset);
> >        break;
> >      case DW_CFA_def_cfa_offset_sf:
> >        results->cfaRegisterOffset = (int32_t)
> >          (addressSpace.getSLEB128(p, instructionsEnd) *
> > cieInfo.dataAlignFactor);
> >        results->codeOffsetAtStackDecrement = (uint32_t)codeOffset;
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_def_cfa_offset_sf(%d)\n",
> > -                results->cfaRegisterOffset);
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_def_cfa_offset_sf(%d)\n",
> > +                             results->cfaRegisterOffset);
> >        break;
> >      case DW_CFA_val_offset:
> >        reg = addressSpace.getULEB128(p, instructionsEnd);
> > @@ -615,10 +602,9 @@ bool CFI_Parser<A>::parseInstructions(A
> >                                                      *
> > cieInfo.dataAlignFactor;
> >        results->savedRegisters[reg].location = kRegisterOffsetFromCFA;
> >        results->savedRegisters[reg].value = offset;
> > -      if (logDwarf)
> > -        fprintf(stderr,
> > -                "DW_CFA_val_offset(reg=%" PRIu64 ", offset=%" PRId64
> > "\n", reg,
> > -                offset);
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_val_offset(reg=%" PRIu64 ", "
> > +                             "offset=%" PRId64 "\n",
> > +                             reg, offset);
> >        break;
> >      case DW_CFA_val_offset_sf:
> >        reg = addressSpace.getULEB128(p, instructionsEnd);
> > @@ -630,10 +616,9 @@ bool CFI_Parser<A>::parseInstructions(A
> >            addressSpace.getSLEB128(p, instructionsEnd) *
> > cieInfo.dataAlignFactor;
> >        results->savedRegisters[reg].location = kRegisterOffsetFromCFA;
> >        results->savedRegisters[reg].value = offset;
> > -      if (logDwarf)
> > -        fprintf(stderr,
> > -                "DW_CFA_val_offset_sf(reg=%" PRIu64 ", offset=%" PRId64
> > "\n",
> > -                reg, offset);
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_val_offset_sf(reg=%" PRIu64 ", "
> > +                             "offset=%" PRId64 "\n",
> > +                             reg, offset);
> >        break;
> >      case DW_CFA_val_expression:
> >        reg = addressSpace.getULEB128(p, instructionsEnd);
> > @@ -645,16 +630,14 @@ bool CFI_Parser<A>::parseInstructions(A
> >        results->savedRegisters[reg].value = (int64_t)p;
> >        length = addressSpace.getULEB128(p, instructionsEnd);
> >        p += length;
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_val_expression(reg=%" PRIu64
> > -                        ", expression=0x%" PRIx64 ", length=%" PRIu64
> > ")\n",
> > -                reg, results->savedRegisters[reg].value, length);
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_val_expression(reg=%" PRIu64 ", "
> > +                             "expression=0x%" PRIx64 ", length=%" PRIu64
> > ")\n",
> > +                             reg, results->savedRegisters[reg].value,
> > length);
> >        break;
> >      case DW_CFA_GNU_args_size:
> >        length = addressSpace.getULEB128(p, instructionsEnd);
> >        results->spExtraArgSize = (uint32_t)length;
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_GNU_args_size(%" PRIu64 ")\n", length);
> > +      _LIBUNWIND_TRACE_DWARF("DW_CFA_GNU_args_size(%" PRIu64 ")\n",
> > length);
> >        break;
> >      case DW_CFA_GNU_negative_offset_extended:
> >        reg = addressSpace.getULEB128(p, instructionsEnd);
> > @@ -667,9 +650,8 @@ bool CFI_Parser<A>::parseInstructions(A
> >                                                      *
> > cieInfo.dataAlignFactor;
> >        results->savedRegisters[reg].location = kRegisterInCFA;
> >        results->savedRegisters[reg].value = -offset;
> > -      if (logDwarf)
> > -        fprintf(stderr, "DW_CFA_GNU_negative_offset_extended(%" PRId64
> > ")\n",
> > -                offset);
> > +      _LIBUNWIND_TRACE_DWARF(
> > +          "DW_CFA_GNU_negative_offset_extended(%" PRId64 ")\n",
> offset);
> >        break;
> >      default:
> >        operand = opcode & 0x3F;
> > @@ -680,25 +662,22 @@ bool CFI_Parser<A>::parseInstructions(A
> >                                                      *
> > cieInfo.dataAlignFactor;
> >          results->savedRegisters[reg].location = kRegisterInCFA;
> >          results->savedRegisters[reg].value = offset;
> > -        if (logDwarf)
> > -          fprintf(stderr, "DW_CFA_offset(reg=%d, offset=%" PRId64 ")\n",
> > -                  operand, offset);
> > +        _LIBUNWIND_TRACE_DWARF("DW_CFA_offset(reg=%d, offset=%" PRId64
> > ")\n",
> > +                               operand, offset);
> >          break;
> >        case DW_CFA_advance_loc:
> >          codeOffset += operand * cieInfo.codeAlignFactor;
> > -        if (logDwarf)
> > -          fprintf(stderr, "DW_CFA_advance_loc: new offset=%" PRIu64
> "\n",
> > -                  (uint64_t)codeOffset);
> > +        _LIBUNWIND_TRACE_DWARF("DW_CFA_advance_loc: new offset=%"
> PRIu64
> > "\n",
> > +                               static_cast<uint64_t>(codeOffset));
> >          break;
> >        case DW_CFA_restore:
> >          reg = operand;
> >          results->savedRegisters[reg] = initialState.savedRegisters[
> reg];
> > -        if (logDwarf)
> > -          fprintf(stderr, "DW_CFA_restore(reg=%" PRIu64 ")\n", reg);
> > +        _LIBUNWIND_TRACE_DWARF("DW_CFA_restore(reg=%" PRIu64 ")\n",
> > +                               static_cast<long>(operand));
> >          break;
> >        default:
> > -        if (logDwarf)
> > -          fprintf(stderr, "unknown CFA opcode 0x%02X\n", opcode);
> > +        _LIBUNWIND_TRACE_DWARF("unknown CFA opcode 0x%02X\n", opcode);
> >          return false;
> >        }
> >      }
> >
> > Modified: libunwind/trunk/src/libunwind.cpp
> > URL: http://llvm.org/viewvc/llvm-
> > project/libunwind/trunk/src/libunwind.cpp?rev=292722&r1=
> 292721&r2=292722&v
> > iew=diff
> > ============================================================
> ==============
> > ====
> > --- libunwind/trunk/src/libunwind.cpp (original)
> > +++ libunwind/trunk/src/libunwind.cpp Sat Jan 21 10:22:57 2017
> > @@ -371,5 +371,17 @@ bool logUnwinding() {
> >    return log;
> >  }
> >
> > +_LIBUNWIND_HIDDEN
> > +bool logDWARF() {
> > +  // do manual lock to avoid use of _cxa_guard_acquire or initializers
> > +  static bool checked = false;
> > +  static bool log = false;
> > +  if (!checked) {
> > +    log = (getenv("LIBUNWIND_PRINT_DWARF") != NULL);
> > +    checked = true;
> > +  }
> > +  return log;
> > +}
> > +
> >  #endif // NDEBUG
> >
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>



-- 
Saleem Abdulrasool
compnerd (at) compnerd (dot) org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170124/77d06384/attachment-0001.html>


More information about the cfe-commits mailing list