;
27using namespaceCodeGen;
30raw_ostream &OS = llvm::errs();
31OS <<
"(ABIArgInfo Kind=";
34OS <<
"Direct Type=";
63OS <<
"CoerceAndExpand Type=";
71: Info(
std::move(Info)) {}
117 returnllvm::CallingConv::SPIR_KERNEL;
121llvm::PointerType *
T,
QualTypeQT)
const{
122 returnllvm::ConstantPointerNull::get(
T);
129 "Address space agnostic languages only");
135 LangASDestAddr, llvm::Type *DestTy,
boolisNonNull)
const{
138 if(
auto*
C= dyn_cast<llvm::Constant>(Src))
142Src, DestTy, Src->hasName() ? Src->getName() +
".ascast":
"");
148llvm::Type *DestTy)
const{
151 returnllvm::ConstantExpr::getPointerCast(Src, DestTy);
157llvm::AtomicOrdering Ordering,
158llvm::LLVMContext &Ctx)
const{
159 returnCtx.getOrInsertSyncScopeID(
"");
164 if(llvm::Function *Fn = dyn_cast_or_null<llvm::Function>(GV)) {
166Fn->addFnAttr(
"stack-probe-size",
169Fn->addFnAttr(
"no-stack-arg-probe");
179 CodeGenFunction&CGF, llvm::Function *Invoke, llvm::Type *BlockTy)
const{
180 auto*InvokeFT = Invoke->getFunctionType();
182std::string Name = Invoke->getName().str() +
"_kernel";
183 auto*FT = llvm::FunctionType::get(llvm::Type::getVoidTy(
C),
184InvokeFT->params(),
false);
185 auto*F = llvm::Function::Create(FT, llvm::GlobalValue::ExternalLinkage, Name,
187llvm::CallingConv::ID KernelCC =
189F->setCallingConv(KernelCC);
191llvm::AttrBuilder KernelAttrs(
C);
195F->addFnAttrs(KernelAttrs);
197 autoIP = CGF.
Builder.saveIP();
198 auto*BB = llvm::BasicBlock::Create(
C,
"entry", F);
200Builder.SetInsertPoint(BB);
202llvm::CallInst *
Call= Builder.CreateCall(Invoke, Args);
203 Call->setCallingConv(Invoke->getCallingConv());
205Builder.CreateRetVoid();
206Builder.restoreIP(IP);
217F.addFnAttr(
"sign-return-address-key", BPI.
getSignKeyStr());
219 if(F.hasFnAttribute(
"sign-return-address"))
220F.removeFnAttr(
"sign-return-address");
221 if(F.hasFnAttribute(
"sign-return-address-key"))
222F.removeFnAttr(
"sign-return-address-key");
225 autoAddRemoveAttributeAsSet = [&](
bool Set,
constStringRef &ModAttr) {
227F.addFnAttr(ModAttr);
228 else if(F.hasFnAttribute(ModAttr))
229F.removeFnAttr(ModAttr);
233 "branch-target-enforcement");
235 "branch-protection-pauth-lr");
245FuncAttrs.addAttribute(
"sign-return-address-key", BPI.
getSignKeyStr());
248FuncAttrs.addAttribute(
"branch-target-enforcement");
250FuncAttrs.addAttribute(
"branch-protection-pauth-lr");
252FuncAttrs.addAttribute(
"guarded-control-stack");
263std::unique_ptr<TargetCodeGenInfo>
265 returnstd::make_unique<DefaultTargetCodeGenInfo>(CGM.
getTypes());
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
unsigned getInAllocaFieldIndex() const
bool getIndirectByVal() const
llvm::StructType * getCoerceAndExpandType() const
bool getIndirectRealign() const
unsigned getIndirectAddrSpace() const
@ Extend
Extend - Valid only for integer argument types.
@ Ignore
Ignore - Ignore the argument (treat as void).
@ IndirectAliased
IndirectAliased - Similar to Indirect, but the pointer may be to an object that is otherwise referenc...
@ Expand
Expand - Only valid for aggregate argument types.
@ InAlloca
InAlloca - Pass the argument directly using the LLVM inalloca attribute.
@ Indirect
Indirect - Pass the argument indirectly via a hidden pointer with the specified alignment (0 indicate...
@ CoerceAndExpand
CoerceAndExpand - Only valid for aggregate argument types.
@ Direct
Direct - Pass the argument directly using the normal converted LLVM type, or by coercing to another s...
llvm::Type * getCoerceToType() const
CharUnits getIndirectAlign() const
Address CreateAddrSpaceCast(Address Addr, llvm::Type *Ty, llvm::Type *ElementTy, const llvm::Twine &Name="")
CallArgList - Type for representing both the value and type of arguments in a call.
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
CodeGenTypes & getTypes() const
llvm::LLVMContext & getLLVMContext()
This class organizes the cross-function state that is used while generating LLVM code.
llvm::Module & getModule() const
const LangOptions & getLangOpts() const
CodeGenTypes & getTypes()
const CodeGenOptions & getCodeGenOpts() const
void addDefaultFunctionDefinitionAttributes(llvm::AttrBuilder &attrs)
Like the overload taking a Function &, but intended specifically for frontends that want to build on ...
This class organizes the cross-module state that is used while lowering AST types to LLVM types.
unsigned ClangCallConvToLLVMCallConv(CallingConv CC)
Convert clang calling convention to LLVM callilng convention.
DefaultABIInfo - The default implementation for ABI specific details.
TargetCodeGenInfo - This class organizes various target-specific codegeneration issues,...
virtual unsigned getSizeOfUnwindException() const
Determines the size of struct _Unwind_Exception on this platform, in 8-bit units.
virtual void getDependentLibraryOption(llvm::StringRef Lib, llvm::SmallString< 24 > &Opt) const
Gets the linker options necessary to link a dependent library on this platform.
Address performAddrSpaceCast(CodeGen::CodeGenFunction &CGF, Address Addr, LangAS SrcAddr, LangAS DestAddr, llvm::Type *DestTy, bool IsNonNull=false) const
virtual llvm::SyncScope::ID getLLVMSyncScopeID(const LangOptions &LangOpts, SyncScope Scope, llvm::AtomicOrdering Ordering, llvm::LLVMContext &Ctx) const
Get the syncscope used in LLVM IR.
static void setBranchProtectionFnAttributes(const TargetInfo::BranchProtectionInfo &BPI, llvm::Function &F)
virtual unsigned getOpenCLKernelCallingConv() const
Get LLVM calling convention for OpenCL kernel.
virtual LangAS getGlobalVarAddressSpace(CodeGenModule &CGM, const VarDecl *D) const
Get target favored AST address space of a global variable for languages other than OpenCL and CUDA.
void addStackProbeTargetAttributes(const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &CGM) const
virtual llvm::Constant * getNullPointer(const CodeGen::CodeGenModule &CGM, llvm::PointerType *T, QualType QT) const
Get target specific null pointer.
static void initBranchProtectionFnAttributes(const TargetInfo::BranchProtectionInfo &BPI, llvm::AttrBuilder &FuncAttrs)
TargetCodeGenInfo(std::unique_ptr< ABIInfo > Info)
virtual llvm::Value * createEnqueuedBlockKernel(CodeGenFunction &CGF, llvm::Function *BlockInvokeFunc, llvm::Type *BlockTy) const
Create an OpenCL kernel for an enqueued block.
virtual ~TargetCodeGenInfo()
virtual bool isNoProtoCallVariadic(const CodeGen::CallArgList &args, const FunctionNoProtoType *fnType) const
Determine whether a call to an unprototyped functions under the given calling convention should use t...
Decl - This represents one declaration (or definition), e.g.
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
@ None
No signing for any function.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
A (possibly-)qualified type.
Scope - A scope is a transient data structure that is used while parsing the program.
LangOptions::SignReturnAddressScopeKind SignReturnAddr
const char * getSignKeyStr() const
bool BranchProtectionPAuthLR
bool BranchTargetEnforcement
const char * getSignReturnAddrStr() const
Represents a variable declaration or definition.
std::unique_ptr< TargetCodeGenInfo > createDefaultTargetCodeGenInfo(CodeGenModule &CGM)
The JSON file list parser is used to communicate input to InstallAPI.
LangAS
Defines the address space values used by the address space qualifier of QualType.
const FunctionProtoType * T
SyncScope
Defines synch scope values used internally by clang.
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