mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
434c32b43d
Move the DWARF syntax highlighting into support. This has several advantages, most notably that this makes the WithColor RAII wrapper available outside libDebugInfo. Furthermore, several projects all have their own code for handling colored output. This provides a place to centralize it. Differential revision: https://reviews.llvm.org/D44215 llvm-svn: 327108
102 lines
2.9 KiB
C++
102 lines
2.9 KiB
C++
//===- DWARFDebugMacro.cpp ------------------------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/DebugInfo/DWARF/DWARFDebugMacro.h"
|
|
#include "llvm/BinaryFormat/Dwarf.h"
|
|
#include "llvm/Support/WithColor.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
#include <cstdint>
|
|
|
|
using namespace llvm;
|
|
using namespace dwarf;
|
|
|
|
void DWARFDebugMacro::dump(raw_ostream &OS) const {
|
|
unsigned IndLevel = 0;
|
|
for (const Entry &E : Macros) {
|
|
// There should not be DW_MACINFO_end_file when IndLevel is Zero. However,
|
|
// this check handles the case of corrupted ".debug_macinfo" section.
|
|
if (IndLevel > 0)
|
|
IndLevel -= (E.Type == DW_MACINFO_end_file);
|
|
// Print indentation.
|
|
for (unsigned I = 0; I < IndLevel; I++)
|
|
OS << " ";
|
|
IndLevel += (E.Type == DW_MACINFO_start_file);
|
|
|
|
WithColor(OS, HighlightColor::Macro).get() << MacinfoString(E.Type);
|
|
switch (E.Type) {
|
|
default:
|
|
// Got a corrupted ".debug_macinfo" section (invalid macinfo type).
|
|
break;
|
|
case DW_MACINFO_define:
|
|
case DW_MACINFO_undef:
|
|
OS << " - lineno: " << E.Line;
|
|
OS << " macro: " << E.MacroStr;
|
|
break;
|
|
case DW_MACINFO_start_file:
|
|
OS << " - lineno: " << E.Line;
|
|
OS << " filenum: " << E.File;
|
|
break;
|
|
case DW_MACINFO_end_file:
|
|
break;
|
|
case DW_MACINFO_vendor_ext:
|
|
OS << " - constant: " << E.ExtConstant;
|
|
OS << " string: " << E.ExtStr;
|
|
break;
|
|
}
|
|
OS << "\n";
|
|
}
|
|
}
|
|
|
|
void DWARFDebugMacro::parse(DataExtractor data) {
|
|
uint32_t Offset = 0;
|
|
while (data.isValidOffset(Offset)) {
|
|
// A macro list entry consists of:
|
|
Entry E;
|
|
// 1. Macinfo type
|
|
E.Type = data.getULEB128(&Offset);
|
|
|
|
if (E.Type == 0) {
|
|
// Reached end of ".debug_macinfo" section.
|
|
return;
|
|
}
|
|
|
|
switch (E.Type) {
|
|
default:
|
|
// Got a corrupted ".debug_macinfo" section (invalid macinfo type).
|
|
// Push the corrupted entry to the list and halt parsing.
|
|
E.Type = DW_MACINFO_invalid;
|
|
Macros.push_back(E);
|
|
return;
|
|
case DW_MACINFO_define:
|
|
case DW_MACINFO_undef:
|
|
// 2. Source line
|
|
E.Line = data.getULEB128(&Offset);
|
|
// 3. Macro string
|
|
E.MacroStr = data.getCStr(&Offset);
|
|
break;
|
|
case DW_MACINFO_start_file:
|
|
// 2. Source line
|
|
E.Line = data.getULEB128(&Offset);
|
|
// 3. Source file id
|
|
E.File = data.getULEB128(&Offset);
|
|
break;
|
|
case DW_MACINFO_end_file:
|
|
break;
|
|
case DW_MACINFO_vendor_ext:
|
|
// 2. Vendor extension constant
|
|
E.ExtConstant = data.getULEB128(&Offset);
|
|
// 3. Vendor extension string
|
|
E.ExtStr = data.getCStr(&Offset);
|
|
break;
|
|
}
|
|
|
|
Macros.push_back(E);
|
|
}
|
|
}
|