;
30 boolIsLambdaStaticInvoker =
false;
31 if(
const auto*MD = dyn_cast<CXXMethodDecl>(FuncDecl);
32MD && MD->isLambdaStaticInvoker()) {
38IsLambdaStaticInvoker =
true;
44assert(MD->isFunctionTemplateSpecialization() &&
45 "A generic lambda's static-invoker function must be a " 46 "template specialization");
50 void*InsertPos =
nullptr;
53assert(CorrespondingCallOpSpecialization);
54FuncDecl = cast<CXXMethodDecl>(CorrespondingCallOpSpecialization);
62llvm::DenseMap<unsigned, Function::ParamDescriptor> ParamDescriptors;
71ParamTypes.push_back(
PT_Ptr);
79 boolHasThisPointer =
false;
80 if(
const auto*MD = dyn_cast<CXXMethodDecl>(FuncDecl)) {
81 if(!IsLambdaStaticInvoker) {
82HasThisPointer = MD->isInstance();
83 if(MD->isImplicitObjectMemberFunction()) {
84ParamTypes.push_back(
PT_Ptr);
94 if(!MD->getParent()->isCompleteDefinition())
98llvm::DenseMap<const ValueDecl *, FieldDecl *> LC;
101MD->
getParent()->getCaptureFields(LC, LTC);
103 for(
autoCap : LC) {
111Offset, Cap.second->getType()->isReferenceType()};
125std::optional<PrimType>
T= Ctx.
classify(PD->getType());
128ParamDescriptors.insert({
ParamOffset, {PT, Desc}});
132ParamTypes.push_back(PT);
139std::move(ParamDescriptors),
140std::move(ParamOffsets), HasThisPointer, HasRVO);
148 Func->setDefined(
false);
152 Func->setDefined(
true);
155 boolIsEligibleForCompilation =
false;
156 if(
const auto*MD = dyn_cast<CXXMethodDecl>(FuncDecl))
157IsEligibleForCompilation = MD->isLambdaStaticInvoker();
158 if(!IsEligibleForCompilation)
159IsEligibleForCompilation =
163 if(!IsEligibleForCompilation || !
visitFunc(FuncDecl)) {
164 Func->setIsFullyCompiled(
true);
171Scopes.emplace_back(std::move(DS));
175 Func->setCode(NextLocalOffset, std::move(Code), std::move(SrcMap),
176std::move(Scopes), FuncDecl->
hasBody());
177 Func->setIsFullyCompiled(
true);
191llvm::DenseMap<unsigned, Function::ParamDescriptor> ParamDescriptors;
196std::optional<PrimType>
T= Ctx.
classify(PD->getType());
199ParamDescriptors.insert({
ParamOffset, {PT, Desc}});
203ParamTypes.push_back(PT);
212std::move(ParamDescriptors), std::move(ParamOffsets),
216 Func->setDefined(
true);
218 Func->setIsFullyCompiled(
true);
223NextLocalOffset +=
sizeof(
Block);
224 unsignedLocation = NextLocalOffset;
225NextLocalOffset +=
align(
D->getAllocSize());
226 return{Location,
D};
230 const size_t Target= Code.size();
233 if(
autoIt = LabelRelocs.find(
Label); It != LabelRelocs.end()) {
234 for(
unsignedReloc : It->second) {
235 using namespacellvm::support;
238 void*Location = Code.data() + Reloc -
align(
sizeof(int32_t));
240 constint32_t Offset =
Target-
static_cast<int64_t
>(Reloc);
241endian::write<int32_t, llvm::endianness::native>(Location, Offset);
243LabelRelocs.erase(It);
247int32_t ByteCodeEmitter::getOffset(LabelTy
Label) {
249 constint64_t Position =
254 if(
autoIt = LabelOffsets.find(
Label); It != LabelOffsets.end())
255 returnIt->second - Position;
258LabelRelocs[
Label].push_back(Position);
264template<
typenameT>
269 if constexpr(std::is_pointer_v<T>)
270Size =
sizeof(uint32_t);
274 if(Code.size() + Size > std::numeric_limits<unsigned>::max()) {
280 size_tValPos =
align(Code.size());
282assert(
aligned(ValPos + Size));
283Code.resize(ValPos + Size);
285 if constexpr(!std::is_pointer_v<T>) {
286 new(Code.data() + ValPos)
T(Val);
288uint32_t ID =
P.getOrCreateNativePointer(Val);
289 new(Code.data() + ValPos) uint32_t(ID);
295template<
typenameT>
298 size_tSize = Val.bytesToSerialize();
300 if(Code.size() + Size > std::numeric_limits<unsigned>::max()) {
306 size_tValPos =
align(Code.size());
308assert(
aligned(ValPos + Size));
309Code.resize(ValPos + Size);
311Val.serialize(Code.data() + ValPos);
338template<
typename... Tys>
339boolByteCodeEmitter::emitOp(
OpcodeOp,
constTys &...Args,
347SrcMap.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