Skip to content

Commit b83e97e

Browse files
authored
Merge pull request llvm#8637 from apple/jdevlieghere/CTF
🍒 Compact C Type Format Cherrypicks
2 parents 9ad96fa + 18e12db commit b83e97e

File tree

7 files changed

+569
-260
lines changed

7 files changed

+569
-260
lines changed
Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
//===-- CTFTypes.h ----------------------------------------------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_CTF_CTFTYPES_H
10+
#define LLDB_SOURCE_PLUGINS_SYMBOLFILE_CTF_CTFTYPES_H
11+
12+
#include "lldb/lldb-types.h"
13+
#include "llvm/ADT/StringRef.h"
14+
15+
namespace lldb_private {
16+
17+
struct CTFType {
18+
enum Kind : uint32_t {
19+
eUnknown = 0,
20+
eInteger = 1,
21+
eFloat = 2,
22+
ePointer = 3,
23+
eArray = 4,
24+
eFunction = 5,
25+
eStruct = 6,
26+
eUnion = 7,
27+
eEnum = 8,
28+
eForward = 9,
29+
eTypedef = 10,
30+
eVolatile = 11,
31+
eConst = 12,
32+
eRestrict = 13,
33+
eSlice = 14,
34+
};
35+
36+
Kind kind;
37+
lldb::user_id_t uid;
38+
llvm::StringRef name;
39+
40+
CTFType(Kind kind, lldb::user_id_t uid, llvm::StringRef name)
41+
: kind(kind), uid(uid), name(name) {}
42+
};
43+
44+
struct CTFInteger : public CTFType {
45+
CTFInteger(lldb::user_id_t uid, llvm::StringRef name, uint32_t bits,
46+
uint32_t encoding)
47+
: CTFType(eInteger, uid, name), bits(bits), encoding(encoding) {}
48+
49+
static bool classof(const CTFType *T) { return T->kind == eInteger; }
50+
51+
uint32_t bits;
52+
uint32_t encoding;
53+
};
54+
55+
struct CTFModifier : public CTFType {
56+
protected:
57+
CTFModifier(Kind kind, lldb::user_id_t uid, uint32_t type)
58+
: CTFType(kind, uid, ""), type(type) {}
59+
60+
static bool classof(const CTFType *T) {
61+
return T->kind == ePointer || T->kind == eConst || T->kind == eVolatile ||
62+
T->kind == eRestrict;
63+
}
64+
65+
public:
66+
uint32_t type;
67+
};
68+
69+
struct CTFPointer : public CTFModifier {
70+
CTFPointer(lldb::user_id_t uid, uint32_t type)
71+
: CTFModifier(ePointer, uid, type) {}
72+
73+
static bool classof(const CTFType *T) { return T->kind == ePointer; }
74+
};
75+
76+
struct CTFConst : public CTFModifier {
77+
CTFConst(lldb::user_id_t uid, uint32_t type)
78+
: CTFModifier(eConst, uid, type) {}
79+
80+
static bool classof(const CTFType *T) { return T->kind == eConst; }
81+
};
82+
83+
struct CTFVolatile : public CTFModifier {
84+
CTFVolatile(lldb::user_id_t uid, uint32_t type)
85+
: CTFModifier(eVolatile, uid, type) {}
86+
87+
static bool classof(const CTFType *T) { return T->kind == eVolatile; }
88+
};
89+
90+
struct CTFRestrict : public CTFModifier {
91+
CTFRestrict(lldb::user_id_t uid, uint32_t type)
92+
: CTFModifier(eRestrict, uid, type) {}
93+
static bool classof(const CTFType *T) { return T->kind == eRestrict; }
94+
};
95+
96+
struct CTFTypedef : public CTFType {
97+
CTFTypedef(lldb::user_id_t uid, llvm::StringRef name, uint32_t type)
98+
: CTFType(eTypedef, uid, name), type(type) {}
99+
100+
static bool classof(const CTFType *T) { return T->kind == eTypedef; }
101+
102+
uint32_t type;
103+
};
104+
105+
struct CTFArray : public CTFType {
106+
CTFArray(lldb::user_id_t uid, llvm::StringRef name, uint32_t type,
107+
uint32_t index, uint32_t nelems)
108+
: CTFType(eArray, uid, name), type(type), index(index), nelems(nelems) {}
109+
110+
static bool classof(const CTFType *T) { return T->kind == eArray; }
111+
112+
uint32_t type;
113+
uint32_t index;
114+
uint32_t nelems;
115+
};
116+
117+
struct CTFEnum : public CTFType {
118+
struct Value {
119+
Value(llvm::StringRef name, uint32_t value) : name(name), value(value){};
120+
llvm::StringRef name;
121+
uint32_t value;
122+
};
123+
124+
CTFEnum(lldb::user_id_t uid, llvm::StringRef name, uint32_t nelems,
125+
uint32_t size, std::vector<Value> values)
126+
: CTFType(eEnum, uid, name), nelems(nelems), size(size),
127+
values(std::move(values)) {
128+
assert(this->values.size() == nelems);
129+
}
130+
131+
static bool classof(const CTFType *T) { return T->kind == eEnum; }
132+
133+
uint32_t nelems;
134+
uint32_t size;
135+
std::vector<Value> values;
136+
};
137+
138+
struct CTFFunction : public CTFType {
139+
CTFFunction(lldb::user_id_t uid, llvm::StringRef name, uint32_t nargs,
140+
uint32_t return_type, std::vector<uint32_t> args, bool variadic)
141+
: CTFType(eFunction, uid, name), nargs(nargs), return_type(return_type),
142+
args(std::move(args)), variadic(variadic) {}
143+
144+
static bool classof(const CTFType *T) { return T->kind == eFunction; }
145+
146+
uint32_t nargs;
147+
uint32_t return_type;
148+
149+
std::vector<uint32_t> args;
150+
bool variadic = false;
151+
};
152+
153+
struct CTFRecord : public CTFType {
154+
public:
155+
struct Field {
156+
Field(llvm::StringRef name, uint32_t type, uint64_t offset)
157+
: name(name), type(type), offset(offset) {}
158+
159+
llvm::StringRef name;
160+
uint32_t type;
161+
uint64_t offset;
162+
};
163+
164+
CTFRecord(Kind kind, lldb::user_id_t uid, llvm::StringRef name,
165+
uint32_t nfields, uint32_t size, std::vector<Field> fields)
166+
: CTFType(kind, uid, name), nfields(nfields), size(size),
167+
fields(std::move(fields)) {}
168+
169+
static bool classof(const CTFType *T) {
170+
return T->kind == eStruct || T->kind == eUnion;
171+
}
172+
173+
uint32_t nfields;
174+
uint32_t size;
175+
std::vector<Field> fields;
176+
};
177+
178+
struct CTFStruct : public CTFRecord {
179+
CTFStruct(lldb::user_id_t uid, llvm::StringRef name, uint32_t nfields,
180+
uint32_t size, std::vector<Field> fields)
181+
: CTFRecord(eStruct, uid, name, nfields, size, std::move(fields)){};
182+
183+
static bool classof(const CTFType *T) { return T->kind == eStruct; }
184+
};
185+
186+
struct CTFUnion : public CTFRecord {
187+
CTFUnion(lldb::user_id_t uid, llvm::StringRef name, uint32_t nfields,
188+
uint32_t size, std::vector<Field> fields)
189+
: CTFRecord(eUnion, uid, name, nfields, size, std::move(fields)){};
190+
191+
static bool classof(const CTFType *T) { return T->kind == eUnion; }
192+
};
193+
194+
struct CTFForward : public CTFType {
195+
CTFForward(lldb::user_id_t uid, llvm::StringRef name)
196+
: CTFType(eForward, uid, name) {}
197+
198+
static bool classof(const CTFType *T) { return T->kind == eForward; }
199+
};
200+
201+
} // namespace lldb_private
202+
203+
#endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_CTF_CTFTYPES_H

0 commit comments

Comments
 (0)