A RetroSearch Logo

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

Search Query:

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

clang: lib/AST/ByteCode/ByteCodeEmitter.cpp Source File

20using namespace clang

;

30 bool

IsLambdaStaticInvoker =

false

;

31 if

(

const auto

*MD = dyn_cast<CXXMethodDecl>(FuncDecl);

32

MD && MD->isLambdaStaticInvoker()) {

38

IsLambdaStaticInvoker =

true

;

44

assert(MD->isFunctionTemplateSpecialization() &&

45 "A generic lambda's static-invoker function must be a " 46 "template specialization"

);

50 void

*InsertPos =

nullptr

;

53

assert(CorrespondingCallOpSpecialization);

54

FuncDecl = cast<CXXMethodDecl>(CorrespondingCallOpSpecialization);

62

llvm::DenseMap<unsigned, Function::ParamDescriptor> ParamDescriptors;

71

ParamTypes.push_back(

PT_Ptr

);

79 bool

HasThisPointer =

false

;

80 if

(

const auto

*MD = dyn_cast<CXXMethodDecl>(FuncDecl)) {

81 if

(!IsLambdaStaticInvoker) {

82

HasThisPointer = MD->isInstance();

83 if

(MD->isImplicitObjectMemberFunction()) {

84

ParamTypes.push_back(

PT_Ptr

);

94 if

(!MD->getParent()->isCompleteDefinition())

98

llvm::DenseMap<const ValueDecl *, FieldDecl *> LC;

101

MD->

getParent

()->getCaptureFields(LC, LTC);

103 for

(

auto

Cap : LC) {

111

Offset, Cap.second->getType()->isReferenceType()};

125

std::optional<PrimType>

T

= Ctx.

classify

(PD->getType());

128

ParamDescriptors.insert({

ParamOffset

, {PT, Desc}});

132

ParamTypes.push_back(PT);

139

std::move(ParamDescriptors),

140

std::move(ParamOffsets), HasThisPointer, HasRVO);

148 Func

->setDefined(

false

);

152 Func

->setDefined(

true

);

155 bool

IsEligibleForCompilation =

false

;

156 if

(

const auto

*MD = dyn_cast<CXXMethodDecl>(FuncDecl))

157

IsEligibleForCompilation = MD->isLambdaStaticInvoker();

158 if

(!IsEligibleForCompilation)

159

IsEligibleForCompilation =

163 if

(!IsEligibleForCompilation || !

visitFunc

(FuncDecl)) {

164 Func

->setIsFullyCompiled(

true

);

171

Scopes.emplace_back(std::move(DS));

175 Func

->setCode(NextLocalOffset, std::move(Code), std::move(SrcMap),

176

std::move(Scopes), FuncDecl->

hasBody

());

177 Func

->setIsFullyCompiled(

true

);

191

llvm::DenseMap<unsigned, Function::ParamDescriptor> ParamDescriptors;

196

std::optional<PrimType>

T

= Ctx.

classify

(PD->getType());

199

ParamDescriptors.insert({

ParamOffset

, {PT, Desc}});

203

ParamTypes.push_back(PT);

212

std::move(ParamDescriptors), std::move(ParamOffsets),

216 Func

->setDefined(

true

);

218 Func

->setIsFullyCompiled(

true

);

223

NextLocalOffset +=

sizeof

(

Block

);

224 unsigned

Location = NextLocalOffset;

225

NextLocalOffset +=

align

(

D

->getAllocSize());

226 return

{Location,

D

};

230 const size_t Target

= Code.size();

233 if

(

auto

It = LabelRelocs.find(

Label

); It != LabelRelocs.end()) {

234 for

(

unsigned

Reloc : It->second) {

235 using namespace

llvm::support;

238 void

*Location = Code.data() + Reloc -

align

(

sizeof

(int32_t));

240 const

int32_t Offset =

Target

-

static_cast<

int64_t

>

(Reloc);

241

endian::write<int32_t, llvm::endianness::native>(Location, Offset);

243

LabelRelocs.erase(It);

247

int32_t ByteCodeEmitter::getOffset(LabelTy

Label

) {

249 const

int64_t Position =

254 if

(

auto

It = LabelOffsets.find(

Label

); It != LabelOffsets.end())

255 return

It->second - Position;

258

LabelRelocs[

Label

].push_back(Position);

264template

<

typename

T>

269 if constexpr

(std::is_pointer_v<T>)

270

Size =

sizeof

(uint32_t);

274 if

(Code.size() + Size > std::numeric_limits<unsigned>::max()) {

280 size_t

ValPos =

align

(Code.size());

282

assert(

aligned

(ValPos + Size));

283

Code.resize(ValPos + Size);

285 if constexpr

(!std::is_pointer_v<T>) {

286 new

(Code.data() + ValPos)

T

(Val);

288

uint32_t ID =

P

.getOrCreateNativePointer(Val);

289 new

(Code.data() + ValPos) uint32_t(ID);

295template

<

typename

T>

298 size_t

Size = Val.bytesToSerialize();

300 if

(Code.size() + Size > std::numeric_limits<unsigned>::max()) {

306 size_t

ValPos =

align

(Code.size());

308

assert(

aligned

(ValPos + Size));

309

Code.resize(ValPos + Size);

311

Val.serialize(Code.data() + ValPos);

338template

<

typename

... Tys>

339bool

ByteCodeEmitter::emitOp(

Opcode

Op,

const

Tys &...Args,

347

SrcMap.emplace_back(Code.size(), SI);

375#include "Opcodes.inc"

This file provides some common utility functions for processing Lambda related AST Constructs.

static void emit(Program &P, std::vector< std::byte > &Code, const T &Val, bool &Success)

Helper to write bytecode and bail out if 32-bit offsets become invalid.

static void emitSerialized(std::vector< std::byte > &Code, const T &Val, bool &Success)

Emits a serializable value.

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

llvm::MachO::Target Target

Represents a block literal declaration, which is like an unnamed FunctionDecl.

bool hasCaptures() const

True if this block (or its nested blocks) captures anything of local storage from its enclosing scope...

ArrayRef< ParmVarDecl * > parameters() const

BlockExpr - Adaptor class for mixing a BlockDecl with expressions.

const BlockDecl * getBlockDecl() const

Represents a static or instance method of a struct/union/class.

Represents a C++ struct/union/class.

bool isGenericLambda() const

Determine whether this class describes a generic lambda function object (i.e.

capture_const_iterator captures_end() const

capture_const_iterator captures_begin() const

CXXMethodDecl * getLambdaCallOperator() const

Retrieve the lambda call operator of the closure type if this is a closure type.

DeclContext * getParent()

getParent - Returns the containing DeclContext.

Represents a member of a struct/union/class.

const RecordDecl * getParent() const

Returns the parent of this field declaration, which is the struct in which this field is defined.

Represents a function declaration or definition.

FunctionTemplateDecl * getDescribedFunctionTemplate() const

Retrieves the function template that is described by this function declaration.

QualType getReturnType() const

ArrayRef< ParmVarDecl * > parameters() const

param_iterator param_begin()

bool isConstexpr() const

Whether this is a (C++11) constexpr function or constexpr constructor.

bool hasBody(const FunctionDecl *&Definition) const

Returns true if the function has a body.

bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const

Returns true if the function has a definition that does not need to be instantiated.

bool willHaveBody() const

True if this function will eventually have a body, once it's fully parsed.

Declaration of a template function.

FunctionDecl * findSpecialization(ArrayRef< TemplateArgument > Args, void *&InsertPos)

Return the specialization with the provided arguments if it exists, otherwise return the insertion po...

Represents a parameter to a function.

A (possibly-)qualified type.

A template argument list.

ArrayRef< TemplateArgument > asArray() const

Produce this as an array ref.

bool isPointerType() const

bool isReferenceType() const

A memory block, either on the stack or in the heap.

bool jump(const LabelTy &Label)

void emitLabel(LabelTy Label)

Define a label.

ParamOffset LambdaThisCapture

Offset of the This parameter in a lambda record.

llvm::DenseMap< const ParmVarDecl *, ParamOffset > Params

Parameter indices.

llvm::DenseMap< const ValueDecl *, ParamOffset > LambdaCaptures

Lambda captures.

bool fallthrough(const LabelTy &Label)

Local createLocal(Descriptor *D)

Callback for local registration.

Function * compileFunc(const FunctionDecl *FuncDecl)

Compiles the function into the module.

Function * compileObjCBlock(const BlockExpr *BE)

Compile an ObjC block, i.e.

virtual bool visitFunc(const FunctionDecl *E)=0

Methods implemented by the compiler.

bool jumpTrue(const LabelTy &Label)

Emits jumps.

bool jumpFalse(const LabelTy &Label)

llvm::SmallVector< SmallVector< Local, 8 >, 2 > Descriptors

Local descriptors.

std::optional< PrimType > classify(QualType T) const

Classifies a type.

Wrapper around fixed point types.

The program contains and links the bytecode for all functions.

Function * getFunction(const FunctionDecl *F)

Returns a function.

Descriptor * createDescriptor(const DeclTy &D, PrimType Type, Descriptor::MetadataSize MDSize=std::nullopt, bool IsConst=false, bool IsTemporary=false, bool IsMutable=false)

Creates a descriptor for a primitive type.

Function * createFunction(const FunctionDecl *Def, Ts &&...Args)

Creates a new function from a code range.

Record * getOrCreateRecord(const RecordDecl *RD)

Returns a record or creates one if it does not exist.

Structure/Class descriptor.

const Field * getField(const FieldDecl *FD) const

Returns a field.

Describes the statement/declaration an opcode was generated from.

constexpr bool aligned(uintptr_t Value)

constexpr size_t align(size_t Size)

Aligns a size to the pointer alignment.

PrimType

Enumeration of the primitive types of the VM.

size_t primSize(PrimType Type)

Returns the size of a primitive type in bytes.

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

bool isLambdaCallOperator(const CXXMethodDecl *MD)

const FunctionProtoType * T

@ Success

Template argument deduction was successful.

Describes a memory block created by an allocation site.

Information about a local's storage.


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