Path: blob/main/contrib/llvm-project/llvm/lib/DebugInfo/PDB/Native/FormatUtil.cpp
35293 views
//===- FormatUtil.cpp ----------------------------------------- *- C++ --*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/DebugInfo/PDB/Native/FormatUtil.h"910#include "llvm/ADT/STLExtras.h"11#include "llvm/ADT/STLForwardCompat.h"12#include "llvm/ADT/StringExtras.h"13#include "llvm/BinaryFormat/COFF.h"14#include "llvm/DebugInfo/CodeView/CodeView.h"15#include "llvm/Support/FormatAdapters.h"16#include "llvm/Support/FormatVariadic.h"1718using namespace llvm;19using namespace llvm::codeview;20using namespace llvm::pdb;2122std::string llvm::pdb::typesetItemList(ArrayRef<std::string> Opts,23uint32_t IndentLevel, uint32_t GroupSize,24StringRef Sep) {25std::string Result;26while (!Opts.empty()) {27ArrayRef<std::string> ThisGroup;28ThisGroup = Opts.take_front(GroupSize);29Opts = Opts.drop_front(ThisGroup.size());30Result += join(ThisGroup, Sep);31if (!Opts.empty()) {32Result += Sep;33Result += "\n";34Result += std::string(formatv("{0}", fmt_repeat(' ', IndentLevel)));35}36}37return Result;38}3940std::string llvm::pdb::typesetStringList(uint32_t IndentLevel,41ArrayRef<StringRef> Strings) {42std::string Result = "[";43for (const auto &S : Strings) {44Result += std::string(formatv("\n{0}{1}", fmt_repeat(' ', IndentLevel), S));45}46Result += "]";47return Result;48}4950std::string llvm::pdb::formatChunkKind(DebugSubsectionKind Kind,51bool Friendly) {52if (Friendly) {53switch (Kind) {54RETURN_CASE(DebugSubsectionKind, None, "none");55RETURN_CASE(DebugSubsectionKind, Symbols, "symbols");56RETURN_CASE(DebugSubsectionKind, Lines, "lines");57RETURN_CASE(DebugSubsectionKind, StringTable, "strings");58RETURN_CASE(DebugSubsectionKind, FileChecksums, "checksums");59RETURN_CASE(DebugSubsectionKind, FrameData, "frames");60RETURN_CASE(DebugSubsectionKind, InlineeLines, "inlinee lines");61RETURN_CASE(DebugSubsectionKind, CrossScopeImports, "xmi");62RETURN_CASE(DebugSubsectionKind, CrossScopeExports, "xme");63RETURN_CASE(DebugSubsectionKind, ILLines, "il lines");64RETURN_CASE(DebugSubsectionKind, FuncMDTokenMap, "func md token map");65RETURN_CASE(DebugSubsectionKind, TypeMDTokenMap, "type md token map");66RETURN_CASE(DebugSubsectionKind, MergedAssemblyInput,67"merged assembly input");68RETURN_CASE(DebugSubsectionKind, CoffSymbolRVA, "coff symbol rva");69RETURN_CASE(DebugSubsectionKind, XfgHashType, "xfg hash type");70RETURN_CASE(DebugSubsectionKind, XfgHashVirtual, "xfg hash virtual");71}72} else {73switch (Kind) {74RETURN_CASE(DebugSubsectionKind, None, "none");75RETURN_CASE(DebugSubsectionKind, Symbols, "DEBUG_S_SYMBOLS");76RETURN_CASE(DebugSubsectionKind, Lines, "DEBUG_S_LINES");77RETURN_CASE(DebugSubsectionKind, StringTable, "DEBUG_S_STRINGTABLE");78RETURN_CASE(DebugSubsectionKind, FileChecksums, "DEBUG_S_FILECHKSMS");79RETURN_CASE(DebugSubsectionKind, FrameData, "DEBUG_S_FRAMEDATA");80RETURN_CASE(DebugSubsectionKind, InlineeLines, "DEBUG_S_INLINEELINES");81RETURN_CASE(DebugSubsectionKind, CrossScopeImports,82"DEBUG_S_CROSSSCOPEIMPORTS");83RETURN_CASE(DebugSubsectionKind, CrossScopeExports,84"DEBUG_S_CROSSSCOPEEXPORTS");85RETURN_CASE(DebugSubsectionKind, ILLines, "DEBUG_S_IL_LINES");86RETURN_CASE(DebugSubsectionKind, FuncMDTokenMap,87"DEBUG_S_FUNC_MDTOKEN_MAP");88RETURN_CASE(DebugSubsectionKind, TypeMDTokenMap,89"DEBUG_S_TYPE_MDTOKEN_MAP");90RETURN_CASE(DebugSubsectionKind, MergedAssemblyInput,91"DEBUG_S_MERGED_ASSEMBLYINPUT");92RETURN_CASE(DebugSubsectionKind, CoffSymbolRVA,93"DEBUG_S_COFF_SYMBOL_RVA");94RETURN_CASE(DebugSubsectionKind, XfgHashType,95"DEBUG_S_XFGHASH_TYPE");96RETURN_CASE(DebugSubsectionKind, XfgHashVirtual,97"DEBUG_S_XFGHASH_VIRTUAL");9899}100}101return formatUnknownEnum(Kind);102}103104std::string llvm::pdb::formatSymbolKind(SymbolKind K) {105switch (uint32_t(K)) {106#define SYMBOL_RECORD(EnumName, value, name) \107case EnumName: \108return #EnumName;109#define CV_SYMBOL(EnumName, value) SYMBOL_RECORD(EnumName, value, EnumName)110#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"111}112return formatUnknownEnum(K);113}114115std::string llvm::pdb::formatTypeLeafKind(TypeLeafKind K) {116switch (K) {117#define TYPE_RECORD(EnumName, value, name) \118case EnumName: \119return #EnumName;120#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"121default:122return formatv("UNKNOWN RECORD ({0:X})", llvm::to_underlying(K)).str();123}124}125126std::string llvm::pdb::formatSegmentOffset(uint16_t Segment, uint32_t Offset) {127return std::string(formatv("{0:4}:{1:4}", Segment, Offset));128}129130#define PUSH_CHARACTERISTIC_FLAG(Enum, TheOpt, Value, Style, Descriptive) \131PUSH_FLAG(Enum, TheOpt, Value, \132((Style == CharacteristicStyle::HeaderDefinition) ? #TheOpt \133: Descriptive))134135#define PUSH_MASKED_CHARACTERISTIC_FLAG(Enum, Mask, TheOpt, Value, Style, \136Descriptive) \137PUSH_MASKED_FLAG(Enum, Mask, TheOpt, Value, \138((Style == CharacteristicStyle::HeaderDefinition) \139? #TheOpt \140: Descriptive))141142std::string llvm::pdb::formatSectionCharacteristics(uint32_t IndentLevel,143uint32_t C,144uint32_t FlagsPerLine,145StringRef Separator,146CharacteristicStyle Style) {147using SC = COFF::SectionCharacteristics;148std::vector<std::string> Opts;149if (C == COFF::SC_Invalid)150return "invalid";151if (C == 0)152return "none";153PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_TYPE_NOLOAD, C, Style, "noload");154PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_TYPE_NO_PAD, C, Style, "no padding");155PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_CNT_CODE, C, Style, "code");156PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_CNT_INITIALIZED_DATA, C, Style,157"initialized data");158PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_CNT_UNINITIALIZED_DATA, C, Style,159"uninitialized data");160PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_LNK_OTHER, C, Style, "other");161PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_LNK_INFO, C, Style, "info");162PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_LNK_REMOVE, C, Style, "remove");163PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_LNK_COMDAT, C, Style, "comdat");164PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_GPREL, C, Style, "gp rel");165PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_MEM_PURGEABLE, C, Style, "purgeable");166PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_MEM_16BIT, C, Style, "16-bit");167PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_MEM_LOCKED, C, Style, "locked");168PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_MEM_PRELOAD, C, Style, "preload");169PUSH_MASKED_CHARACTERISTIC_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_1BYTES, C,170Style, "1 byte align");171PUSH_MASKED_CHARACTERISTIC_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_2BYTES, C,172Style, "2 byte align");173PUSH_MASKED_CHARACTERISTIC_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_4BYTES, C,174Style, "4 byte align");175PUSH_MASKED_CHARACTERISTIC_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_8BYTES, C,176Style, "8 byte align");177PUSH_MASKED_CHARACTERISTIC_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_16BYTES, C,178Style, "16 byte align");179PUSH_MASKED_CHARACTERISTIC_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_32BYTES, C,180Style, "32 byte align");181PUSH_MASKED_CHARACTERISTIC_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_64BYTES, C,182Style, "64 byte align");183PUSH_MASKED_CHARACTERISTIC_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_128BYTES, C,184Style, "128 byte align");185PUSH_MASKED_CHARACTERISTIC_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_256BYTES, C,186Style, "256 byte align");187PUSH_MASKED_CHARACTERISTIC_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_512BYTES, C,188Style, "512 byte align");189PUSH_MASKED_CHARACTERISTIC_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_1024BYTES, C,190Style, "1024 byte align");191PUSH_MASKED_CHARACTERISTIC_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_2048BYTES, C,192Style, "2048 byte align");193PUSH_MASKED_CHARACTERISTIC_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_4096BYTES, C,194Style, "4096 byte align");195PUSH_MASKED_CHARACTERISTIC_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_8192BYTES, C,196Style, "8192 byte align");197PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_LNK_NRELOC_OVFL, C, Style,198"noreloc overflow");199PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_MEM_DISCARDABLE, C, Style,200"discardable");201PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_MEM_NOT_CACHED, C, Style,202"not cached");203PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_MEM_NOT_PAGED, C, Style, "not paged");204PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_MEM_SHARED, C, Style, "shared");205PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_MEM_EXECUTE, C, Style,206"execute permissions");207PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_MEM_READ, C, Style,208"read permissions");209PUSH_CHARACTERISTIC_FLAG(SC, IMAGE_SCN_MEM_WRITE, C, Style,210"write permissions");211return typesetItemList(Opts, IndentLevel, FlagsPerLine, Separator);212}213214215