LLVM: lib/DebugInfo/CodeView/RecordName.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

10

22

23using namespace llvm;

25

26namespace {

28

29 TypeCollection &Types;

31

32

33 SmallString<256> Name;

34

35public:

36 explicit TypeNameComputer(TypeCollection &Types) : Types(Types) {}

37

38 StringRef name() const { return Name; }

39

40

41

42 Error visitTypeBegin(CVType &Record) override;

43 Error visitTypeBegin(CVType &Record, TypeIndex Index) override;

44 Error visitTypeEnd(CVType &Record) override;

45

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"

51};

52}

53

55 llvm_unreachable("Must call visitTypeBegin with a TypeIndex!");

57}

58

59Error TypeNameComputer::visitTypeBegin(CVType &Record, TypeIndex Index) {

60

61 Name = "";

62 CurrentTypeIndex = Index;

64}

65

67

68Error TypeNameComputer::visitKnownRecord(CVType &CVR,

70 Name = "";

72}

73

74Error TypeNameComputer::visitKnownRecord(CVRecord &CVR,

75 StringIdRecord &String) {

76 Name = String.getString();

78}

79

80Error TypeNameComputer::visitKnownRecord(CVType &CVR, ArgListRecord &Args) {

81 auto Indices = Args.getIndices();

82 uint32_t Size = Indices.size();

83 Name = "(";

84 for (uint32_t I = 0; I < Size; ++I) {

85 if (Indices[I] < CurrentTypeIndex)

87 else

88 Name.append("<unknown 0x" + utohexstr(Indices[I].getIndex()) + ">");

89 if (I + 1 != Size)

91 }

94}

95

96Error TypeNameComputer::visitKnownRecord(CVType &CVR,

97 StringListRecord &Strings) {

99 uint32_t Size = Indices.size();

100 Name = "\"";

101 for (uint32_t I = 0; I < Size; ++I) {

103 if (I + 1 != Size)

104 Name.append("\" \"");

105 }

108}

109

110Error TypeNameComputer::visitKnownRecord(CVType &CVR, ClassRecord &Class) {

111 Name = Class.getName();

113}

114

115Error TypeNameComputer::visitKnownRecord(CVType &CVR, UnionRecord &Union) {

116 Name = Union.getName();

118}

119

120Error TypeNameComputer::visitKnownRecord(CVType &CVR, EnumRecord &Enum) {

121 Name = Enum.getName();

123}

124

125Error TypeNameComputer::visitKnownRecord(CVType &CVR, ArrayRecord &AT) {

128}

129

130Error TypeNameComputer::visitKnownRecord(CVType &CVR, VFTableRecord &VFT) {

133}

134

135Error TypeNameComputer::visitKnownRecord(CVType &CVR, MemberFuncIdRecord &Id) {

136 Name = Id.getName();

138}

139

140Error TypeNameComputer::visitKnownRecord(CVType &CVR, ProcedureRecord &Proc) {

143 Name = formatv("{0} {1}", Ret, Params).sstr<256>();

145}

146

147Error TypeNameComputer::visitKnownRecord(CVType &CVR,

148 MemberFunctionRecord &MF) {

152 Name = formatv("{0} {1}::{2}", Ret, Class, Params).sstr<256>();

154}

155

156Error TypeNameComputer::visitKnownRecord(CVType &CVR, FuncIdRecord &Func) {

157 Name = Func.getName();

159}

160

161Error TypeNameComputer::visitKnownRecord(CVType &CVR, TypeServer2Record &TS) {

164}

165

166Error TypeNameComputer::visitKnownRecord(CVType &CVR, PointerRecord &Ptr) {

167

170

173 Name = formatv("{0} {1}::*", Pointee, Class);

174 } else {

176

177 if (Ptr.getMode() == PointerMode::LValueReference)

179 else if (Ptr.getMode() == PointerMode::RValueReference)

181 else if (Ptr.getMode() == PointerMode::Pointer)

183

184

185

187 Name.append(" const");

189 Name.append(" volatile");

191 Name.append(" __unaligned");

193 Name.append(" __restrict");

194 }

196}

197

198Error TypeNameComputer::visitKnownRecord(CVType &CVR, ModifierRecord &Mod) {

199 uint16_t Mods = static_cast<uint16_t>(Mod.getModifiers());

200

201 if (Mods & uint16_t(ModifierOptions::Const))

202 Name.append("const ");

203 if (Mods & uint16_t(ModifierOptions::Volatile))

204 Name.append("volatile ");

205 if (Mods & uint16_t(ModifierOptions::Unaligned))

206 Name.append("__unaligned ");

209}

210

211Error TypeNameComputer::visitKnownRecord(CVType &CVR,

212 VFTableShapeRecord &Shape) {

215}

216

217Error TypeNameComputer::visitKnownRecord(

218 CVType &CVR, UdtModSourceLineRecord &ModSourceLine) {

220}

221

222Error TypeNameComputer::visitKnownRecord(CVType &CVR,

223 UdtSourceLineRecord &SourceLine) {

225}

226

227Error TypeNameComputer::visitKnownRecord(CVType &CVR, BitFieldRecord &BF) {

229}

230

231Error TypeNameComputer::visitKnownRecord(CVType &CVR,

232 MethodOverloadListRecord &Overloads) {

234}

235

236Error TypeNameComputer::visitKnownRecord(CVType &CVR, BuildInfoRecord &BI) {

238}

239

240Error TypeNameComputer::visitKnownRecord(CVType &CVR, LabelRecord &R) {

242}

243

244Error TypeNameComputer::visitKnownRecord(CVType &CVR,

245 PrecompRecord &Precomp) {

247}

248

249Error TypeNameComputer::visitKnownRecord(CVType &CVR,

250 EndPrecompRecord &EndPrecomp) {

252}

253

256 TypeNameComputer Computer(Types);

260 return "";

261 }

262 return std::string(Computer.name());

263}

264

266 switch (Sym.kind()) {

267

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:

274 return 35;

275

276 case SymbolKind::S_THUNK32:

277 return 21;

278

279 case SymbolKind::S_SECTION:

280 return 16;

281

282 case SymbolKind::S_COFFGROUP:

283 return 14;

284

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:

296 return 10;

297

298 case SymbolKind::S_REGISTER:

299 case SymbolKind::S_LOCAL:

300 return 6;

301

302 case SymbolKind::S_BLOCK32:

303 return 18;

304

305 case SymbolKind::S_LABEL32:

306 return 7;

307

308 case SymbolKind::S_OBJNAME:

309 case SymbolKind::S_EXPORT:

310 case SymbolKind::S_UDT:

311 return 4;

312

313 case SymbolKind::S_BPREL32:

314 return 8;

315

316 case SymbolKind::S_UNAMESPACE:

317 return 0;

318 default:

319 return -1;

320 }

321}

322

324 if (Sym.kind() == SymbolKind::S_CONSTANT) {

325

326

328

334 return Const.Name;

335 }

336

340

343}

if(auto Err=PB.parsePassPipeline(MPM, Passes)) return wrap(std MPM run * Mod

static int getSymbolNameOffset(CVSymbol Sym)

Definition RecordName.cpp:265

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 getReferentType() const

MemberPointerInfo getMemberInfo() const

bool isPointerToMember() const

PointerMode getMode() 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)

Definition RecordName.cpp:254

CVRecord< SymbolKind > CVSymbol

LLVM_ABI StringRef getSymbolName(CVSymbol Sym)

Definition RecordName.cpp:323

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.