29 TypeCollection &Types;
33 SmallString<256> Name;
36 explicit TypeNameComputer(TypeCollection &Types) : Types(Types) {}
38 StringRef
name()
const {
return Name; }
43 Error visitTypeBegin(
CVType &Record, TypeIndex Index)
override;
46#define TYPE_RECORD(EnumName, EnumVal, Name) \
47 Error visitKnownRecord(CVType &CVR, Name##Record &Record) override;
48#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
49#define MEMBER_RECORD(EnumName, EnumVal, Name)
50#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
59Error TypeNameComputer::visitTypeBegin(
CVType &Record, TypeIndex Index) {
62 CurrentTypeIndex =
Index;
68Error TypeNameComputer::visitKnownRecord(
CVType &CVR,
70 Name =
"<field list>";
74Error TypeNameComputer::visitKnownRecord(CVRecord<TypeLeafKind> &CVR,
80Error TypeNameComputer::visitKnownRecord(
CVType &CVR, ArgListRecord &Args) {
81 auto Indices =
Args.getIndices();
82 uint32_t
Size = Indices.size();
84 for (uint32_t
I = 0;
I <
Size; ++
I) {
85 if (Indices[
I] < CurrentTypeIndex)
96Error TypeNameComputer::visitKnownRecord(
CVType &CVR,
97 StringListRecord &Strings) {
99 uint32_t
Size = Indices.size();
101 for (uint32_t
I = 0;
I <
Size; ++
I) {
110Error TypeNameComputer::visitKnownRecord(
CVType &CVR, ClassRecord &Class) {
111 Name =
Class.getName();
115Error TypeNameComputer::visitKnownRecord(
CVType &CVR, UnionRecord &Union) {
116 Name =
Union.getName();
120Error TypeNameComputer::visitKnownRecord(
CVType &CVR, EnumRecord &Enum) {
121 Name =
Enum.getName();
125Error TypeNameComputer::visitKnownRecord(
CVType &CVR, ArrayRecord &AT) {
130Error TypeNameComputer::visitKnownRecord(
CVType &CVR, VFTableRecord &VFT) {
135Error TypeNameComputer::visitKnownRecord(
CVType &CVR, MemberFuncIdRecord &Id) {
140Error TypeNameComputer::visitKnownRecord(
CVType &CVR, ProcedureRecord &Proc) {
143 Name =
formatv(
"{0} {1}", Ret, Params).sstr<256>();
147Error TypeNameComputer::visitKnownRecord(
CVType &CVR,
148 MemberFunctionRecord &MF) {
152 Name =
formatv(
"{0} {1}::{2}", Ret, Class, Params).sstr<256>();
156Error TypeNameComputer::visitKnownRecord(
CVType &CVR, FuncIdRecord &Func) {
157 Name =
Func.getName();
161Error TypeNameComputer::visitKnownRecord(
CVType &CVR, TypeServer2Record &TS) {
166Error TypeNameComputer::visitKnownRecord(
CVType &CVR, PointerRecord &
Ptr) {
168 if (
Ptr.isPointerToMember()) {
169 const MemberPointerInfo &
MI =
Ptr.getMemberInfo();
173 Name =
formatv(
"{0} {1}::*", Pointee, Class);
177 if (
Ptr.getMode() == PointerMode::LValueReference)
179 else if (
Ptr.getMode() == PointerMode::RValueReference)
181 else if (
Ptr.getMode() == PointerMode::Pointer)
188 if (
Ptr.isVolatile())
190 if (
Ptr.isUnaligned())
191 Name.
append(
" __unaligned");
192 if (
Ptr.isRestrict())
193 Name.
append(
" __restrict");
198Error TypeNameComputer::visitKnownRecord(
CVType &CVR, ModifierRecord &
Mod) {
199 uint16_t Mods =
static_cast<uint16_t
>(
Mod.getModifiers());
201 if (Mods & uint16_t(ModifierOptions::Const))
203 if (Mods & uint16_t(ModifierOptions::Volatile))
205 if (Mods & uint16_t(ModifierOptions::Unaligned))
206 Name.
append(
"__unaligned ");
211Error TypeNameComputer::visitKnownRecord(
CVType &CVR,
212 VFTableShapeRecord &Shape) {
217Error TypeNameComputer::visitKnownRecord(
218 CVType &CVR, UdtModSourceLineRecord &ModSourceLine) {
222Error TypeNameComputer::visitKnownRecord(
CVType &CVR,
223 UdtSourceLineRecord &SourceLine) {
227Error TypeNameComputer::visitKnownRecord(
CVType &CVR, BitFieldRecord &BF) {
231Error TypeNameComputer::visitKnownRecord(
CVType &CVR,
232 MethodOverloadListRecord &Overloads) {
236Error TypeNameComputer::visitKnownRecord(
CVType &CVR, BuildInfoRecord &BI) {
240Error TypeNameComputer::visitKnownRecord(
CVType &CVR, LabelRecord &R) {
244Error TypeNameComputer::visitKnownRecord(
CVType &CVR,
245 PrecompRecord &Precomp) {
249Error TypeNameComputer::visitKnownRecord(
CVType &CVR,
250 EndPrecompRecord &EndPrecomp) {
256 TypeNameComputer Computer(Types);
260 return "<unknown UDT>";
262 return std::string(Computer.name());
266 switch (Sym.
kind()) {
268 case SymbolKind::S_GPROC32:
269 case SymbolKind::S_LPROC32:
270 case SymbolKind::S_GPROC32_ID:
271 case SymbolKind::S_LPROC32_ID:
272 case SymbolKind::S_LPROC32_DPC:
273 case SymbolKind::S_LPROC32_DPC_ID:
276 case SymbolKind::S_THUNK32:
279 case SymbolKind::S_SECTION:
282 case SymbolKind::S_COFFGROUP:
285 case SymbolKind::S_PUB32:
286 case SymbolKind::S_FILESTATIC:
287 case SymbolKind::S_REGREL32:
288 case SymbolKind::S_GDATA32:
289 case SymbolKind::S_LDATA32:
290 case SymbolKind::S_LMANDATA:
291 case SymbolKind::S_GMANDATA:
292 case SymbolKind::S_LTHREAD32:
293 case SymbolKind::S_GTHREAD32:
294 case SymbolKind::S_PROCREF:
295 case SymbolKind::S_LPROCREF:
298 case SymbolKind::S_REGISTER:
299 case SymbolKind::S_LOCAL:
302 case SymbolKind::S_BLOCK32:
305 case SymbolKind::S_LABEL32:
308 case SymbolKind::S_OBJNAME:
309 case SymbolKind::S_EXPORT:
310 case SymbolKind::S_UDT:
313 case SymbolKind::S_BPREL32:
316 case SymbolKind::S_UNAMESPACE:
324 if (Sym.
kind() == SymbolKind::S_CONSTANT) {
if(auto Err=PB.parsePassPipeline(MPM, Passes)) return wrap(std MPM run * Mod
static int getSymbolNameOffset(CVSymbol Sym)
This file defines the SmallString class.
Provides read only access to a subclass of BinaryStream.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
const RecordRecTy * getType() const
void append(StringRef RHS)
Append from a StringRef.
void push_back(const T &Elt)
StringRef - Represent a constant reference to a string, i.e.
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
StringRef getName() const
ArrayRef< uint8_t > content() const
TypeIndex getReturnType() const
TypeIndex getArgumentList() const
TypeIndex getClassType() const
TypeIndex getReturnType() const
TypeIndex getArgumentList() const
ArrayRef< TypeIndex > getIndices() const
Error visitSymbolEnd(CVSymbol &Record) override
Error visitSymbolBegin(CVSymbol &Record) override
virtual StringRef getTypeName(TypeIndex Index)=0
StringRef getName() const
StringRef getName() const
uint32_t getEntryCount() const
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
CVRecord< TypeLeafKind > CVType
LLVM_ABI std::string computeTypeName(TypeCollection &Types, TypeIndex Index)
CVRecord< SymbolKind > CVSymbol
LLVM_ABI StringRef getSymbolName(CVSymbol Sym)
LLVM_ABI Error visitTypeRecord(CVType &Record, TypeIndex Index, TypeVisitorCallbacks &Callbacks, VisitorDataSource Source=VDS_BytesPresent)
NodeAddr< FuncNode * > Func
This is an optimization pass for GlobalISel generic memory operations.
std::string utohexstr(uint64_t X, bool LowerCase=false, unsigned Width=0)
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
void cantFail(Error Err, const char *Msg=nullptr)
Report a fatal error if Err is a failure value.
void consumeError(Error Err)
Consume a Error without doing anything.
StringRef toStringRef(bool B)
Construct a string ref from a boolean.