[libunwind] r292722 - DWARF: allow enabling tracing at runtime
Oliver Stannard via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 23 04:01:17 PST 2017
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
More information about the cfe-commits
mailing list