[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