A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://clang.llvm.org/doxygen/LayoutOverrideSource_8cpp_source.html below:

clang: lib/Frontend/LayoutOverrideSource.cpp Source File

12#include "llvm/Support/raw_ostream.h" 16using namespace clang

;

27 return

S.substr(0, Offset).str();

32 if

(S.empty() || !

isDigit

(S[0]))

35 while

(Idx < S.size() &&

isDigit

(S[Idx]))

37

(void)S.substr(0, Idx).getAsInteger(10, ULL);

43

std::ifstream Input(

Filename

.str().c_str());

48

std::string CurrentType;

50 bool

ExpectingType =

false

;

52 while

(Input.good()) {

54

getline(Input,

Line

);

56

StringRef LineStr(

Line

);

59 if

(LineStr.contains(

"*** Dumping AST Record Layout"

)) {

61 if

(!CurrentType.empty())

62

Layouts[CurrentType] = CurrentLayout;

63

CurrentLayout = Layout();

65

ExpectingType =

true

;

71

ExpectingType =

false

;

73

StringRef::size_type Pos;

74 if

((Pos = LineStr.find(

"struct "

)) != StringRef::npos)

75

LineStr = LineStr.substr(Pos + strlen(

"struct "

));

76 else if

((Pos = LineStr.find(

"class "

)) != StringRef::npos)

77

LineStr = LineStr.substr(Pos + strlen(

"class "

));

78 else if

((Pos = LineStr.find(

"union "

)) != StringRef::npos)

79

LineStr = LineStr.substr(Pos + strlen(

"union "

));

85

CurrentLayout = Layout();

90

StringRef::size_type Pos = LineStr.find(

" Size:"

);

91 if

(Pos != StringRef::npos) {

93

LineStr = LineStr.substr(Pos + strlen(

" Size:"

));

95 unsigned long long

Size = 0;

97

CurrentLayout.Size = Size;

102

Pos = LineStr.find(

"Alignment:"

);

103 if

(Pos != StringRef::npos) {

105

LineStr = LineStr.substr(Pos + strlen(

"Alignment:"

));

107 unsigned long long

Alignment = 0;

109

CurrentLayout.Align = Alignment;

115

Pos = LineStr.find(

"sizeof="

);

116 if

(Pos != StringRef::npos) {

118

LineStr = LineStr.substr(Pos + strlen(

"sizeof="

));

121 unsigned long long

Size = 0;

123

CurrentLayout.Size = Size * 8;

125

Pos = LineStr.find(

"align="

);

126 if

(Pos != StringRef::npos) {

128

LineStr = LineStr.substr(Pos + strlen(

"align="

));

131 unsigned long long

Alignment = 0;

133

CurrentLayout.Align = Alignment * 8;

140

Pos = LineStr.find(

"FieldOffsets: ["

);

141 if

(Pos != StringRef::npos) {

142

LineStr = LineStr.substr(Pos + strlen(

"FieldOffsets: ["

));

143 while

(!LineStr.empty() &&

isDigit

(LineStr[0])) {

144 unsigned long long

Offset = 0;

146

CurrentLayout.FieldOffsets.push_back(Offset);

149

LineStr = LineStr.substr(1);

155

Pos = LineStr.find(

"VBaseOffsets: ["

);

156 if

(Pos != StringRef::npos) {

157

LineStr = LineStr.substr(Pos + strlen(

"VBaseOffsets: ["

));

158 while

(!LineStr.empty() &&

isDigit

(LineStr[0])) {

159 unsigned long long

Offset = 0;

164

LineStr = LineStr.substr(1);

171

Pos = LineStr.find(

"BaseOffsets: ["

);

172 if

(Pos != StringRef::npos) {

173

LineStr = LineStr.substr(Pos + strlen(

"BaseOffsets: ["

));

174 while

(!LineStr.empty() &&

isDigit

(LineStr[0])) {

175 unsigned long long

Offset = 0;

180

LineStr = LineStr.substr(1);

187 if

(!CurrentType.empty())

188

Layouts[CurrentType] = CurrentLayout;

193

uint64_t &Size, uint64_t &Alignment,

194

llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets,

195

llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets,

196

llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets)

199 if

(!

Record

->getIdentifier())

203

llvm::StringMap<Layout>::iterator Known = Layouts.find(

Record

->getName());

204 if

(Known == Layouts.end())

208 unsigned

NumFields = 0;

210

FEnd =

Record

->field_end();

211

F != FEnd; ++F, ++NumFields) {

212 if

(NumFields >= Known->second.FieldOffsets.size())

215

FieldOffsets[*F] = Known->second.FieldOffsets[NumFields];

219 if

(NumFields != Known->second.FieldOffsets.size())

223 if

(

const auto

*RD = dyn_cast<CXXRecordDecl>(

Record

)) {

226 for

(

const auto

&I : RD->vbases()) {

227 if

(NumVB >= Known->second.VBaseOffsets.size())

229 const CXXRecordDecl

*VBase = I.getType()->getAsCXXRecordDecl();

230

VirtualBaseOffsets[VBase] = Known->second.VBaseOffsets[NumVB++];

232 for

(

const auto

&I : RD->bases()) {

233 if

(I.isVirtual() || NumNB >= Known->second.BaseOffsets.size())

236

BaseOffsets[

Base

] = Known->second.BaseOffsets[NumNB++];

240

Size = Known->second.Size;

241

Alignment = Known->second.Align;

246

raw_ostream &OS = llvm::errs();

247 for

(llvm::StringMap<Layout>::iterator L = Layouts.begin(),

248

LEnd = Layouts.end();

250

OS <<

"Type: blah "

<< L->first() <<

'\n'

;

251

OS <<

" Size:"

<< L->second.Size <<

'\n'

;

252

OS <<

" Alignment:"

<< L->second.Align <<

'\n'

;

253

OS <<

" FieldOffsets: ["

;

254 for

(

unsigned

I = 0, N = L->second.FieldOffsets.size(); I != N; ++I) {

257

OS << L->second.FieldOffsets[I];

Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....

static bool parseUnsigned(StringRef &S, unsigned long long &ULL)

Parse an unsigned integer and move S to the next non-digit character.

static std::string parseName(StringRef S)

Parse a simple identifier.

llvm::MachO::Record Record

Represents a C++ struct/union/class.

static CharUnits fromQuantity(QuantityType Quantity)

fromQuantity - Construct a CharUnits quantity from a raw integer type.

specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...

bool layoutRecordType(const RecordDecl *Record, uint64_t &Size, uint64_t &Alignment, llvm::DenseMap< const FieldDecl *, uint64_t > &FieldOffsets, llvm::DenseMap< const CXXRecordDecl *, CharUnits > &BaseOffsets, llvm::DenseMap< const CXXRecordDecl *, CharUnits > &VirtualBaseOffsets) override

If this particular record type has an overridden layout, return that layout.

void dump()

Dump the overridden layouts.

LayoutOverrideSource(StringRef Filename)

Create a new AST source that overrides the layout of some set of record types.

Represents a struct/union/class.

The JSON file list parser is used to communicate input to InstallAPI.

LLVM_READONLY bool isAsciiIdentifierContinue(unsigned char c)

LLVM_READONLY bool isDigit(unsigned char c)

Return true if this character is an ASCII digit: [0-9].

LLVM_READONLY bool isWhitespace(unsigned char c)

Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\t',...

LLVM_READONLY bool isAsciiIdentifierStart(unsigned char c, bool AllowDollar=false)

Returns true if this is a valid first character of a C identifier, which is [a-zA-Z_].


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4