20#include "llvm/ADT/StringExtras.h"
21#include "llvm/ADT/Twine.h"
22#include "llvm/IR/Function.h"
23#include "llvm/IR/Type.h"
24#include "llvm/Support/raw_ostream.h"
27using namespace CodeGen;
30 raw_ostream &OS = llvm::errs();
31 OS <<
"(ABIArgInfo Kind=";
63 OS <<
"CoerceAndExpand Type=";
67 OS <<
"TargetSpecific Type=";
78 : Info(
std::move(Info)) {}
125 return llvm::CallingConv::SPIR_KERNEL;
127 llvm_unreachable(
"Unknown kernel calling convention");
132 FT =
getABIInfo().getContext().adjustFunctionType(
137 llvm::PointerType *
T,
QualType QT)
const {
138 return llvm::ConstantPointerNull::get(
T);
145 "Address space agnostic languages only");
151 llvm::Type *DestTy,
bool isNonNull)
const {
154 if (
auto *
C = dyn_cast<llvm::Constant>(Src))
158 Src, DestTy, Src->hasName() ? Src->getName() +
".ascast" :
"");
164 llvm::Type *DestTy)
const {
167 return llvm::ConstantExpr::getPointerCast(Src, DestTy);
173 llvm::AtomicOrdering Ordering,
174 llvm::LLVMContext &Ctx)
const {
175 return Ctx.getOrInsertSyncScopeID(
"");
180 if (llvm::Function *Fn = dyn_cast_or_null<llvm::Function>(GV)) {
182 Fn->addFnAttr(
"stack-probe-size",
185 Fn->addFnAttr(
"no-stack-arg-probe");
195 CodeGenFunction &CGF, llvm::Function *Invoke, llvm::Type *BlockTy)
const {
196 auto *InvokeFT = Invoke->getFunctionType();
198 std::string Name = Invoke->getName().str() +
"_kernel";
199 auto *FT = llvm::FunctionType::get(llvm::Type::getVoidTy(
C),
200 InvokeFT->params(),
false);
201 auto *F = llvm::Function::Create(FT, llvm::GlobalValue::ExternalLinkage, Name,
203 llvm::CallingConv::ID KernelCC =
205 F->setCallingConv(KernelCC);
207 llvm::AttrBuilder KernelAttrs(
C);
211 F->addFnAttrs(KernelAttrs);
213 auto IP = CGF.
Builder.saveIP();
214 auto *BB = llvm::BasicBlock::Create(
C,
"entry", F);
216 Builder.SetInsertPoint(BB);
218 llvm::CallInst *
Call = Builder.CreateCall(Invoke, Args);
219 Call->setCallingConv(Invoke->getCallingConv());
221 Builder.CreateRetVoid();
222 Builder.restoreIP(IP);
235 if (F.hasFnAttribute(
"sign-return-address"))
236 F.removeFnAttr(
"sign-return-address");
237 if (F.hasFnAttribute(
"sign-return-address-key"))
238 F.removeFnAttr(
"sign-return-address-key");
241 auto AddRemoveAttributeAsSet = [&](
bool Set,
const StringRef &ModAttr) {
243 F.addFnAttr(ModAttr);
244 else if (F.hasFnAttribute(ModAttr))
245 F.removeFnAttr(ModAttr);
249 "branch-target-enforcement");
251 "branch-protection-pauth-lr");
261 FuncAttrs.addAttribute(
"sign-return-address-key", BPI.
getSignKeyStr());
264 FuncAttrs.addAttribute(
"branch-target-enforcement");
266 FuncAttrs.addAttribute(
"branch-protection-pauth-lr");
268 FuncAttrs.addAttribute(
"guarded-control-stack");
273 auto UpdateAttr = [&F](
bool AttrShouldExist, StringRef AttrName) {
274 if (AttrShouldExist && !F.hasFnAttribute(AttrName))
275 F.addFnAttr(AttrName);
276 if (!AttrShouldExist && F.hasFnAttribute(AttrName))
277 F.removeFnAttr(AttrName);
281 UpdateAttr(Opts.
AuthTraps,
"ptrauth-auth-traps");
289 FuncAttrs.addAttribute(
"ptrauth-returns");
291 FuncAttrs.addAttribute(
"ptrauth-calls");
293 FuncAttrs.addAttribute(
"ptrauth-auth-traps");
295 FuncAttrs.addAttribute(
"ptrauth-indirect-gotos");
297 FuncAttrs.addAttribute(
"aarch64-jump-table-hardening");
308std::unique_ptr<TargetCodeGenInfo>
310 return std::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.
@ TargetSpecific
TargetSpecific - Some argument types are passed as target specific types such as RISC-V's tuple type,...
@ 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 getDeviceKernelCallingConv() const
Get LLVM calling convention for device kernels.
virtual unsigned getSizeOfUnwindException() const
Determines the size of struct _Unwind_Exception on this platform, in 8-bit units.
virtual void setOCLKernelStubCallingConvention(const FunctionType *&FT) const
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, 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)
const T & getABIInfo() const
static void initPointerAuthFnAttributes(const PointerAuthOptions &Opts, llvm::AttrBuilder &FuncAttrs)
static void setPointerAuthFnAttributes(const PointerAuthOptions &Opts, llvm::Function &F)
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.
ExtInfo withCallingConv(CallingConv cc) const
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
@ 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 sync scope values used internally by clang.
bool ReturnAddresses
Should return addresses be authenticated?
bool AArch64JumpTableHardening
Use hardened lowering for jump-table dispatch?
PointerAuthSchema FunctionPointers
The ABI for C function pointers.
bool AuthTraps
Do authentication failures cause a trap?
bool IndirectGotos
Do indirect goto label addresses need to be authenticated?