clang 22.0.0git
|
#include "CGBuiltin.h"
#include "ABIInfo.h"
#include "CGCUDARuntime.h"
#include "CGCXXABI.h"
#include "CGDebugInfo.h"
#include "CGObjCRuntime.h"
#include "CGOpenCLRuntime.h"
#include "CGRecordLayout.h"
#include "CGValue.h"
#include "CodeGenFunction.h"
#include "CodeGenModule.h"
#include "ConstantEmitter.h"
#include "PatternInit.h"
#include "TargetInfo.h"
#include "clang/AST/OSLog.h"
#include "clang/AST/StmtVisitor.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/Frontend/FrontendDiagnostic.h"
#include "llvm/IR/InlineAsm.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/IntrinsicsX86.h"
#include "llvm/IR/MatrixBuilder.h"
#include "llvm/Support/ConvertUTF.h"
#include "llvm/Support/ScopedPrinter.h"
#include <optional>
#include <utility>
Go to the source code of this file.
Macros | |
#define | MUTATE_LDBL(func) |
Functions | |
static bool | shouldEmitBuiltinAsIR (unsigned BuiltinID, const Builtin::Context &BI, const CodeGenFunction &CGF) |
Some builtins do not have library implementation on some targets and are instead emitted as LLVM IRs by some target builtin emitters. | |
static Value * | EmitTargetArchBuiltinExpr (CodeGenFunction *CGF, unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue, llvm::Triple::ArchType Arch) |
static void | initializeAlloca (CodeGenFunction &CGF, AllocaInst *AI, Value *Size, Align AlignmentInBytes) |
Value * | EmitToInt (CodeGenFunction &CGF, llvm::Value *V, QualType T, llvm::IntegerType *IntType) |
Emit the conversions required to turn the given value into an integer of the given size. | |
Value * | EmitFromInt (CodeGenFunction &CGF, llvm::Value *V, QualType T, llvm::Type *ResultType) |
Address | CheckAtomicAlignment (CodeGenFunction &CGF, const CallExpr *E) |
Value * | MakeBinaryAtomicValue (CodeGenFunction &CGF, llvm::AtomicRMWInst::BinOp Kind, const CallExpr *E, AtomicOrdering Ordering) |
Utility to insert an atomic instruction based on Intrinsic::ID and the expression node. | |
static Value * | EmitNontemporalStore (CodeGenFunction &CGF, const CallExpr *E) |
static Value * | EmitNontemporalLoad (CodeGenFunction &CGF, const CallExpr *E) |
static RValue | EmitBinaryAtomic (CodeGenFunction &CGF, llvm::AtomicRMWInst::BinOp Kind, const CallExpr *E) |
static RValue | EmitBinaryAtomicPost (CodeGenFunction &CGF, llvm::AtomicRMWInst::BinOp Kind, const CallExpr *E, Instruction::BinaryOps Op, bool Invert=false) |
Utility to insert an atomic instruction based Intrinsic::ID and the expression node, where the return value is the result of the operation. | |
Value * | MakeAtomicCmpXchgValue (CodeGenFunction &CGF, const CallExpr *E, bool ReturnBool) |
Utility to insert an atomic cmpxchg instruction. | |
static Value * | EmitAtomicCmpXchgForMSIntrin (CodeGenFunction &CGF, const CallExpr *E, AtomicOrdering SuccessOrdering=AtomicOrdering::SequentiallyConsistent) |
This function should be invoked to emit atomic cmpxchg for Microsoft's _InterlockedCompareExchange* intrinsics which have the following signature: T _InterlockedCompareExchange(T volatile *Destination,
T Exchange,
T Comparand);. | |
static Value * | EmitAtomicCmpXchg128ForMSIntrin (CodeGenFunction &CGF, const CallExpr *E, AtomicOrdering SuccessOrdering) |
static Value * | EmitAtomicIncrementValue (CodeGenFunction &CGF, const CallExpr *E, AtomicOrdering Ordering=AtomicOrdering::SequentiallyConsistent) |
static Value * | EmitAtomicDecrementValue (CodeGenFunction &CGF, const CallExpr *E, AtomicOrdering Ordering=AtomicOrdering::SequentiallyConsistent) |
static Value * | EmitISOVolatileLoad (CodeGenFunction &CGF, const CallExpr *E) |
static Value * | EmitISOVolatileStore (CodeGenFunction &CGF, const CallExpr *E) |
Value * | emitUnaryMaybeConstrainedFPBuiltin (CodeGenFunction &CGF, const CallExpr *E, unsigned IntrinsicID, unsigned ConstrainedIntrinsicID) |
static Value * | emitBinaryMaybeConstrainedFPBuiltin (CodeGenFunction &CGF, const CallExpr *E, unsigned IntrinsicID, unsigned ConstrainedIntrinsicID) |
static Value * | emitBinaryExpMaybeConstrainedFPBuiltin (CodeGenFunction &CGF, const CallExpr *E, Intrinsic::ID IntrinsicID, Intrinsic::ID ConstrainedIntrinsicID) |
static Value * | emitTernaryMaybeConstrainedFPBuiltin (CodeGenFunction &CGF, const CallExpr *E, unsigned IntrinsicID, unsigned ConstrainedIntrinsicID) |
static Value * | emitMaybeConstrainedFPToIntRoundBuiltin (CodeGenFunction &CGF, const CallExpr *E, unsigned IntrinsicID, unsigned ConstrainedIntrinsicID) |
static Value * | emitFrexpBuiltin (CodeGenFunction &CGF, const CallExpr *E, Intrinsic::ID IntrinsicID) |
static void | emitSincosBuiltin (CodeGenFunction &CGF, const CallExpr *E, Intrinsic::ID IntrinsicID) |
static llvm::Value * | emitModfBuiltin (CodeGenFunction &CGF, const CallExpr *E, Intrinsic::ID IntrinsicID) |
static Value * | EmitFAbs (CodeGenFunction &CGF, Value *V) |
EmitFAbs - Emit a call to @llvm.fabs(). | |
static Value * | EmitSignBit (CodeGenFunction &CGF, Value *V) |
Emit the computation of the sign bit for a floating point value. | |
static bool | HasNoIndirectArgumentsOrResults (CGFunctionInfo const &FnInfo) |
Checks no arguments or results are passed indirectly in the ABI (i.e. | |
static RValue | emitLibraryCall (CodeGenFunction &CGF, const FunctionDecl *FD, const CallExpr *E, llvm::Constant *calleeValue) |
llvm::Value * | EmitOverflowIntrinsic (CodeGenFunction &CGF, const Intrinsic::ID IntrinsicID, llvm::Value *X, llvm::Value *Y, llvm::Value *&Carry) |
Emit a call to llvm. | |
static WidthAndSignedness | getIntegerWidthAndSignedness (const clang::ASTContext &context, const clang::QualType Type) |
static struct WidthAndSignedness | EncompassingIntegerType (ArrayRef< struct WidthAndSignedness > Types) |
static bool | areBOSTypesCompatible (int From, int To) |
Checks if using the result of __builtin_object_size(p, From ) in place of __builtin_object_size(p, To ) is correct. | |
static llvm::Value * | getDefaultBuiltinObjectSizeResult (unsigned Type, llvm::IntegerType *ResType) |
static const FieldDecl * | FindFlexibleArrayMemberField (CodeGenFunction &CGF, ASTContext &Ctx, const RecordDecl *RD) |
Find a struct's flexible array member. | |
static bool | GetFieldOffset (ASTContext &Ctx, const RecordDecl *RD, const FieldDecl *FD, int64_t &Offset) |
Calculate the offset of a struct field. | |
static std::optional< int64_t > | GetFieldOffset (ASTContext &Ctx, const RecordDecl *RD, const FieldDecl *FD) |
static llvm::Value * | EmitPositiveResultOrZero (CodeGenFunction &CGF, llvm::Value *Res, llvm::Value *Index, llvm::IntegerType *ResType, bool IsSigned) |
static std::pair< llvm::Value *, llvm::Value * > | GetCountFieldAndIndex (CodeGenFunction &CGF, const MemberExpr *ME, const FieldDecl *ArrayFD, const FieldDecl *CountFD, const Expr *Idx, llvm::IntegerType *ResType, bool IsSigned) |
static char | bitActionToX86BTCode (BitTest::ActionKind A) |
static llvm::Value * | EmitX86BitTestIntrinsic (CodeGenFunction &CGF, BitTest BT, const CallExpr *E, Value *BitBase, Value *BitPos) |
static llvm::AtomicOrdering | getBitTestAtomicOrdering (BitTest::InterlockingKind I) |
static llvm::Value * | EmitBitCountExpr (CodeGenFunction &CGF, const Expr *E) |
static llvm::Value * | EmitBitTestIntrinsic (CodeGenFunction &CGF, unsigned BuiltinID, const CallExpr *E) |
Emit a _bittest* intrinsic. | |
static RValue | EmitMSVCRTSetJmp (CodeGenFunction &CGF, MSVCSetJmpKind SJKind, const CallExpr *E) |
MSVC handles setjmp a bit differently on different platforms. | |
static Value * | EmitAbs (CodeGenFunction &CGF, Value *ArgValue, bool HasNSW) |
static Value * | EmitOverflowCheckedAbs (CodeGenFunction &CGF, const CallExpr *E, bool SanitizeOverflow) |
static CanQualType | getOSLogArgType (ASTContext &C, int Size) |
Get the argument type for arguments to os_log_helper. | |
static bool | isSpecialUnsignedMultiplySignedResult (unsigned BuiltinID, WidthAndSignedness Op1Info, WidthAndSignedness Op2Info, WidthAndSignedness ResultInfo) |
static RValue | EmitCheckedUnsignedMultiplySignedResult (CodeGenFunction &CGF, const clang::Expr *Op1, WidthAndSignedness Op1Info, const clang::Expr *Op2, WidthAndSignedness Op2Info, const clang::Expr *ResultArg, QualType ResultQTy, WidthAndSignedness ResultInfo) |
static bool | isSpecialMixedSignMultiply (unsigned BuiltinID, WidthAndSignedness Op1Info, WidthAndSignedness Op2Info, WidthAndSignedness ResultInfo) |
Determine if a binop is a checked mixed-sign multiply we can specialize. | |
static RValue | EmitCheckedMixedSignMultiply (CodeGenFunction &CGF, const clang::Expr *Op1, WidthAndSignedness Op1Info, const clang::Expr *Op2, WidthAndSignedness Op2Info, const clang::Expr *ResultArg, QualType ResultQTy, WidthAndSignedness ResultInfo) |
Emit a checked mixed-sign multiply. | |
static bool | TypeRequiresBuiltinLaunderImp (const ASTContext &Ctx, QualType Ty, llvm::SmallPtrSetImpl< const Decl * > &Seen) |
static bool | TypeRequiresBuiltinLaunder (CodeGenModule &CGM, QualType Ty) |
Determine if the specified type requires laundering by checking if it is a dynamic class type or contains a subobject which is a dynamic class type. | |
static unsigned | mutateLongDoubleBuiltin (unsigned BuiltinID) |
static Value * | tryUseTestFPKind (CodeGenFunction &CGF, unsigned BuiltinID, Value *V) |
static RValue | EmitHipStdParUnsupportedBuiltin (CodeGenFunction *CGF, const FunctionDecl *FD) |
#define MUTATE_LDBL | ( | func | ) |
Checks if using the result of __builtin_object_size(p, From
) in place of __builtin_object_size(p, To
) is correct.
Definition at line 908 of file CGBuiltin.cpp.
|
static |
Definition at line 1638 of file CGBuiltin.cpp.
Referenced by EmitX86BitTestIntrinsic().
Address CheckAtomicAlignment | ( | CodeGenFunction & | CGF, |
const CallExpr * | E | ||
) |
Definition at line 274 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::CGM, E, clang::CodeGen::CodeGenFunction::EmitPointerWithAlignment(), clang::CharUnits::fromQuantity(), clang::CodeGen::Address::getAlignment(), clang::Stmt::getBeginLoc(), clang::CodeGen::CodeGenFunction::getContext(), clang::CodeGen::CodeGenModule::getDataLayout(), clang::CodeGen::CodeGenModule::getDiags(), clang::CodeGen::Address::getElementType(), clang::CharUnits::getQuantity(), clang::ASTContext::getTypeSizeInChars(), clang::DiagnosticsEngine::Report(), clang::ASTContext::VoidPtrTy, and clang::CodeGen::Address::withAlignment().
Referenced by clang::CodeGen::CodeGenFunction::EmitAArch64BuiltinExpr(), clang::CodeGen::CodeGenFunction::EmitAMDGPUBuiltinExpr(), EmitAtomicCmpXchgForMSIntrin(), EmitAtomicDecrementValue(), EmitAtomicIncrementValue(), EmitBinaryAtomicPost(), clang::CodeGen::CodeGenFunction::EmitBuiltinExpr(), MakeAtomicCmpXchgValue(), and MakeBinaryAtomicValue().
|
static |
Definition at line 2071 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder.
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr(), and EmitOverflowCheckedAbs().
|
static |
Definition at line 485 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CGBuilderTy::CreateAtomicCmpXchg(), clang::CodeGen::CGBuilderTy::CreateLoad(), clang::CodeGen::CGBuilderTy::CreateStore(), E, clang::CodeGen::CodeGenFunction::EmitPointerWithAlignment(), clang::CodeGen::CodeGenFunction::EmitScalarExpr(), clang::CodeGen::CodeGenFunction::getContext(), clang::CodeGen::CodeGenFunction::getLLVMContext(), clang::CodeGen::CodeGenTypeCache::Int8Ty, clang::Success, clang::ASTContext::toCharUnitsFromBits(), and clang::CodeGen::Address::withElementType().
Referenced by clang::CodeGen::CodeGenFunction::EmitMSVCBuiltinExpr().
|
static |
This function should be invoked to emit atomic cmpxchg for Microsoft's _InterlockedCompareExchange* intrinsics which have the following signature: T _InterlockedCompareExchange(T volatile *Destination, T Exchange, T Comparand);.
Whereas the llvm 'cmpxchg' instruction has the following syntax: cmpxchg *Destination, Comparand, Exchange. So we need to swap Comparand and Exchange when invoking CreateAtomicCmpXchg. That is the reason we could not use the above utility function MakeAtomicCmpXchgValue since it expects the arguments to be already swapped.
Definition at line 430 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, CheckAtomicAlignment(), clang::CodeGen::CGBuilderTy::CreateAtomicCmpXchg(), E, clang::CodeGen::CodeGenFunction::EmitScalarExpr(), clang::CodeGen::CodeGenFunction::getContext(), clang::Type::getPointeeType(), clang::Expr::getType(), clang::ASTContext::hasSameUnqualifiedType(), clang::CodeGen::CodeGenTypeCache::IntPtrTy, clang::Type::isPointerType(), and clang::Result.
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr(), and clang::CodeGen::CodeGenFunction::EmitMSVCBuiltinExpr().
|
static |
Definition at line 549 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, CheckAtomicAlignment(), clang::CodeGen::CodeGenFunction::ConvertType(), clang::CodeGen::CGBuilderTy::CreateAtomicRMW(), E, clang::Expr::getType(), clang::Type::isPointerType(), and clang::Result.
Referenced by clang::CodeGen::CodeGenFunction::EmitMSVCBuiltinExpr().
|
static |
Definition at line 538 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, CheckAtomicAlignment(), clang::CodeGen::CodeGenFunction::ConvertType(), clang::CodeGen::CGBuilderTy::CreateAtomicRMW(), E, clang::Expr::getType(), clang::Type::isPointerType(), and clang::Result.
Referenced by clang::CodeGen::CodeGenFunction::EmitMSVCBuiltinExpr().
|
static |
Definition at line 336 of file CGBuiltin.cpp.
References E, clang::CodeGen::RValue::get(), and MakeBinaryAtomicValue().
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Utility to insert an atomic instruction based Intrinsic::ID and the expression node, where the return value is the result of the operation.
Definition at line 345 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, CheckAtomicAlignment(), clang::CodeGen::CGBuilderTy::CreateAtomicRMW(), E, EmitFromInt(), clang::CodeGen::CodeGenFunction::EmitScalarExpr(), EmitToInt(), clang::CodeGen::RValue::get(), clang::CodeGen::CodeGenFunction::getContext(), clang::CodeGen::CodeGenFunction::getLLVMContext(), clang::Type::getPointeeType(), clang::Expr::getType(), clang::ASTContext::getTypeSize(), clang::ASTContext::hasSameUnqualifiedType(), clang::Type::isPointerType(), clang::Result, and clang::T.
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Definition at line 623 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, E, clang::CodeGen::CodeGenFunction::EmitScalarExpr(), clang::Function, and clang::CodeGen::CodeGenModule::getIntrinsic().
Referenced by clang::CodeGen::CodeGenFunction::EmitAMDGPUBuiltinExpr(), and clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Definition at line 605 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, E, clang::CodeGen::CodeGenFunction::EmitScalarExpr(), clang::Function, and clang::CodeGen::CodeGenModule::getIntrinsic().
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Definition at line 1695 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, E, clang::CodeGen::CodeGenFunction::EmitScalarExpr(), and clang::CodeGen::CodeGenFunction::getLLVMContext().
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr(), and clang::CodeGen::CodeGenFunction::EmitCheckedArgForBuiltin().
|
static |
Emit a _bittest* intrinsic.
These intrinsics take a pointer to an array of bits and a bit position and read and optionally modify the bit at that position. The position index can be arbitrarily large, i.e. it can be larger than 31 or 63, so we need an indexed load in the general case.
Definition at line 1716 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CGBuilderTy::CreateAtomicRMW(), clang::CodeGen::CGBuilderTy::CreateInBoundsGEP(), clang::CodeGen::CGBuilderTy::CreateLoad(), clang::CodeGen::CGBuilderTy::CreateStore(), E, clang::CodeGen::CodeGenFunction::EmitScalarExpr(), EmitX86BitTestIntrinsic(), getBitTestAtomicOrdering(), clang::CodeGen::CodeGenFunction::getTarget(), clang::TargetInfo::getTriple(), clang::Value::getType(), clang::CodeGen::CodeGenTypeCache::Int8Ty, and clang::CharUnits::One().
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Emit a checked mixed-sign multiply.
This is a cheaper specialization of the generic checked-binop irgen.
Definition at line 2365 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenTypes::ConvertType(), clang::CodeGen::CGBuilderTy::CreateStore(), EmitOverflowIntrinsic(), clang::CodeGen::CodeGenFunction::EmitPointerWithAlignment(), clang::CodeGen::CodeGenFunction::EmitScalarExpr(), clang::CodeGen::CodeGenFunction::EmitToMemory(), clang::CodeGen::RValue::get(), clang::Type::getPointeeType(), clang::Expr::getType(), clang::CodeGen::CodeGenFunction::getTypes(), isSpecialMixedSignMultiply(), clang::QualType::isVolatileQualified(), clang::Result, clang::Signed, clang::Unsigned, and clang::Zero.
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Definition at line 2319 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CGBuilderTy::CreateStore(), EmitOverflowIntrinsic(), clang::CodeGen::CodeGenFunction::EmitPointerWithAlignment(), clang::CodeGen::CodeGenFunction::EmitScalarExpr(), clang::CodeGen::CodeGenFunction::EmitToMemory(), clang::CodeGen::RValue::get(), clang::Type::getPointeeType(), clang::Expr::getType(), isSpecialUnsignedMultiplySignedResult(), clang::QualType::isVolatileQualified(), and clang::Result.
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
EmitFAbs - Emit a call to @llvm.fabs().
Definition at line 749 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::Call, clang::CodeGen::CodeGenFunction::CGM, clang::Function, clang::CodeGen::CodeGenModule::getIntrinsic(), and V.
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Definition at line 680 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::Call, clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CodeGenFunction::ConvertType(), E, clang::CodeGen::CodeGenFunction::EmitScalarExpr(), clang::CodeGen::CodeGenFunction::EmitStoreOfScalar(), clang::CodeGen::CodeGenModule::getIntrinsic(), clang::Type::getPointeeType(), clang::Expr::getType(), and clang::CodeGen::CodeGenFunction::MakeNaturalAlignAddrLValue().
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
Value * EmitFromInt | ( | CodeGenFunction & | CGF, |
llvm::Value * | V, | ||
QualType | T, | ||
llvm::Type * | ResultType | ||
) |
Definition at line 263 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::EmitFromMemory(), clang::T, and V.
Referenced by EmitBinaryAtomicPost(), MakeAtomicCmpXchgValue(), and MakeBinaryAtomicValue().
|
static |
Definition at line 2586 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::RValue::get(), clang::CodeGen::CodeGenTypes::GetFunctionType(), clang::CodeGen::CodeGenModule::getModule(), clang::NamedDecl::getNameAsString(), and clang::CodeGen::CodeGenModule::getTypes().
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Definition at line 562 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CGBuilderTy::CreateAlignedLoad(), E, clang::CodeGen::CodeGenFunction::EmitScalarExpr(), clang::CodeGen::CodeGenFunction::getContext(), clang::CodeGen::CodeGenFunction::getLLVMContext(), clang::Type::getPointeeType(), clang::CharUnits::getQuantity(), clang::Expr::getType(), and clang::ASTContext::getTypeSizeInChars().
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Definition at line 574 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CGBuilderTy::CreateAlignedStore(), E, clang::CodeGen::CodeGenFunction::EmitScalarExpr(), clang::CodeGen::CodeGenFunction::getContext(), clang::Type::getPointeeType(), clang::Expr::getType(), and clang::ASTContext::getTypeSizeInChars().
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Definition at line 803 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::ASTContext::BuiltinInfo, clang::Call, clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CodeGenModule::DecorateInstructionWithTBAA(), E, clang::CodeGen::CodeGenFunction::EmitCall(), clang::CodeGen::CGCallee::forDirect(), clang::FunctionDecl::getBuiltinID(), clang::CodeGen::CodeGenFunction::getContext(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::CodeGen::CodeGenModule::getTBAAAccessInfo(), clang::Expr::getType(), HasNoIndirectArgumentsOrResults(), clang::ASTContext::IntTy, and clang::Builtin::Context::isConstWithoutErrnoAndExceptions().
|
static |
Definition at line 662 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CodeGenFunction::ConvertType(), E, clang::CodeGen::CodeGenFunction::EmitScalarExpr(), clang::Function, clang::CodeGen::CodeGenModule::getIntrinsic(), and clang::Expr::getType().
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Definition at line 730 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::Call, E, clang::CodeGen::CodeGenFunction::EmitScalarExpr(), clang::CodeGen::CodeGenFunction::EmitStoreOfScalar(), clang::Type::getPointeeType(), clang::Expr::getType(), and clang::CodeGen::CodeGenFunction::MakeNaturalAlignAddrLValue().
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
MSVC handles setjmp a bit differently on different platforms.
On every architecture except 32-bit x86, the frame address is passed. On x86, extra parameters can be passed as variadic arguments, but we always pass none.
Definition at line 1802 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenTypeCache::AllocaInt8PtrTy, clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CodeGenModule::CreateRuntimeFunction(), E, clang::CodeGen::CodeGenFunction::EmitRuntimeCallOrInvoke(), clang::CodeGen::CodeGenFunction::EmitScalarExpr(), clang::CodeGen::RValue::get(), clang::CodeGen::CodeGenModule::getIntrinsic(), clang::CodeGen::CodeGenFunction::getLLVMContext(), clang::CodeGen::CodeGenFunction::getTarget(), clang::TargetInfo::getTriple(), clang::CodeGen::CodeGenTypeCache::Int32Ty, clang::CodeGen::CodeGenTypeCache::Int8PtrTy, and clang::CodeGen::CodeGenTypeCache::IntTy.
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Definition at line 328 of file CGBuiltin.cpp.
References clang::Addr, E, clang::CodeGen::CodeGenFunction::EmitLoadOfScalar(), clang::CodeGen::CodeGenFunction::EmitPointerWithAlignment(), clang::Expr::getExprLoc(), clang::Expr::getType(), clang::CodeGen::CodeGenFunction::MakeAddrLValue(), and clang::CodeGen::LValue::setNontemporal().
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Definition at line 317 of file CGBuiltin.cpp.
References clang::Addr, E, clang::CodeGen::CodeGenFunction::EmitPointerWithAlignment(), clang::CodeGen::CodeGenFunction::EmitScalarExpr(), clang::CodeGen::CodeGenFunction::EmitStoreOfScalar(), clang::CodeGen::CodeGenFunction::EmitToMemory(), clang::Expr::getType(), clang::CodeGen::CodeGenFunction::MakeAddrLValue(), and clang::CodeGen::LValue::setNontemporal().
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Definition at line 2077 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, E, EmitAbs(), clang::CodeGen::CodeGenFunction::EmitCheck(), clang::CodeGen::CodeGenFunction::EmitCheckSourceLocation(), clang::CodeGen::CodeGenFunction::EmitCheckTypeDescriptor(), clang::CodeGen::CodeGenFunction::EmitScalarExpr(), clang::CodeGen::CodeGenFunction::EmitTrapCheck(), clang::Expr::getExprLoc(), clang::Expr::getType(), clang::Value::getType(), clang::Result, and clang::Zero.
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
llvm::Value * EmitOverflowIntrinsic | ( | CodeGenFunction & | CGF, |
const Intrinsic::ID | IntrinsicID, | ||
llvm::Value * | X, | ||
llvm::Value * | Y, | ||
llvm::Value *& | Carry | ||
) |
Emit a call to llvm.
{sadd,uadd,ssub,usub,smul,umul}.with.overflow.* depending on IntrinsicID.
Definition at line 841 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, clang::Function, clang::CodeGen::CodeGenModule::getIntrinsic(), and X.
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr(), EmitCheckedMixedSignMultiply(), EmitCheckedUnsignedMultiplySignedResult(), and clang::CodeGen::CodeGenFunction::EmitHLSLBuiltinExpr().
|
static |
Definition at line 1109 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder.
|
static |
Emit the computation of the sign bit for a floating point value.
Returns the i1 sign bit value.
Definition at line 758 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::C, clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CodeGenModule::getLLVMContext(), clang::CodeGen::CodeGenFunction::getTarget(), clang::TargetInfo::isBigEndian(), V, and clang::Zero.
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Definition at line 698 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::Call, clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CGBuilderTy::CreateStore(), clang::Domain, E, clang::CodeGen::CodeGenFunction::EmitScalarExpr(), clang::CodeGen::LValue::getAddress(), clang::CodeGen::CodeGenModule::getIntrinsic(), clang::CodeGen::CodeGenFunction::getLLVMContext(), clang::Type::getPointeeType(), clang::Expr::getType(), and clang::CodeGen::CodeGenFunction::MakeNaturalAlignAddrLValue().
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Definition at line 72 of file CGBuiltin.cpp.
References Arch, E, clang::CodeGen::CodeGenFunction::EmitAArch64BuiltinExpr(), clang::CodeGen::CodeGenFunction::EmitAMDGPUBuiltinExpr(), clang::CodeGen::CodeGenFunction::EmitARMBuiltinExpr(), clang::CodeGen::CodeGenFunction::EmitBPFBuiltinExpr(), clang::CodeGen::CodeGenFunction::EmitDirectXBuiltinExpr(), clang::CodeGen::CodeGenFunction::EmitHexagonBuiltinExpr(), clang::CodeGen::CodeGenFunction::EmitNVPTXBuiltinExpr(), clang::CodeGen::CodeGenFunction::EmitPPCBuiltinExpr(), clang::CodeGen::CodeGenFunction::EmitRISCVBuiltinExpr(), clang::CodeGen::CodeGenFunction::EmitSPIRVBuiltinExpr(), clang::CodeGen::CodeGenFunction::EmitSystemZBuiltinExpr(), clang::CodeGen::CodeGenFunction::EmitWebAssemblyBuiltinExpr(), clang::CodeGen::CodeGenFunction::EmitX86BuiltinExpr(), clang::CodeGen::CodeGenFunction::getLangOpts(), clang::CodeGen::CodeGenFunction::getTarget(), and clang::TargetInfo::getTriple().
Referenced by clang::CodeGen::CodeGenFunction::EmitTargetBuiltinExpr().
|
static |
Definition at line 643 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, E, clang::CodeGen::CodeGenFunction::EmitScalarExpr(), clang::Function, and clang::CodeGen::CodeGenModule::getIntrinsic().
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
Value * EmitToInt | ( | CodeGenFunction & | CGF, |
llvm::Value * | V, | ||
QualType | T, | ||
llvm::IntegerType * | IntType | ||
) |
Emit the conversions required to turn the given value into an integer of the given size.
Definition at line 252 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::EmitToMemory(), clang::T, and V.
Referenced by EmitBinaryAtomicPost(), MakeAtomicCmpXchgValue(), and MakeBinaryAtomicValue().
Value * emitUnaryMaybeConstrainedFPBuiltin | ( | CodeGenFunction & | CGF, |
const CallExpr * | E, | ||
unsigned | IntrinsicID, | ||
unsigned | ConstrainedIntrinsicID | ||
) |
Definition at line 588 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, E, clang::CodeGen::CodeGenFunction::EmitScalarExpr(), clang::Function, and clang::CodeGen::CodeGenModule::getIntrinsic().
|
static |
Definition at line 1648 of file CGBuiltin.cpp.
References clang::Asm, bitActionToX86BTCode(), clang::CodeGen::CodeGenFunction::Builder, E, clang::TargetInfo::getClobbers(), clang::CodeGen::CodeGenFunction::getContext(), clang::CodeGen::CodeGenFunction::getLLVMContext(), clang::CodeGen::CodeGenFunction::getTarget(), clang::Expr::getType(), clang::ASTContext::getTypeSize(), and clang::CodeGen::CodeGenTypeCache::Int8Ty.
Referenced by EmitBitTestIntrinsic().
|
static |
Definition at line 876 of file CGBuiltin.cpp.
References clang::Signed.
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Find a struct's flexible array member.
It may be embedded inside multiple sub-structs, but must still be the last field.
Definition at line 985 of file CGBuiltin.cpp.
References clang::RecordDecl::fields(), FindFlexibleArrayMemberField(), clang::CodeGen::CodeGenFunction::getLangOpts(), clang::Decl::isFlexibleArrayMemberLike(), and clang::Decl::isImplicit().
Referenced by FindFlexibleArrayMemberField().
|
static |
Definition at line 1684 of file CGBuiltin.cpp.
Referenced by EmitBitTestIntrinsic().
|
static |
|
static |
Definition at line 916 of file CGBuiltin.cpp.
|
static |
Definition at line 1042 of file CGBuiltin.cpp.
References GetFieldOffset().
|
static |
Calculate the offset of a struct field.
It may be embedded inside multiple sub-structs.
Definition at line 1010 of file CGBuiltin.cpp.
References clang::RecordDecl::fields(), clang::ASTContext::getASTRecordLayout(), GetFieldOffset(), clang::ASTRecordLayout::getFieldOffset(), clang::Decl::isImplicit(), and clang::TagDecl::isUnion().
Referenced by GetFieldOffset().
|
static |
Definition at line 864 of file CGBuiltin.cpp.
References clang::ASTContext::getIntWidth(), clang::Type::isIntegerType(), clang::Type::isSignedIntegerType(), and clang::Signed.
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Get the argument type for arguments to os_log_helper.
Definition at line 2119 of file CGBuiltin.cpp.
References clang::C.
Referenced by clang::CodeGen::CodeGenFunction::emitBuiltinOSLogFormat(), and clang::CodeGen::CodeGenFunction::generateBuiltinOSLogHelperFunction().
|
static |
Checks no arguments or results are passed indirectly in the ABI (i.e.
via a hidden pointer). This is used to check annotating FP libcalls (that could set errno
) with "int" TBAA metadata is safe. If any floating-point arguments are passed indirectly, setup for the call could be incorrectly optimized out.
Definition at line 792 of file CGBuiltin.cpp.
References clang::CodeGen::CGFunctionInfo::arguments(), and clang::CodeGen::CGFunctionInfo::getReturnInfo().
Referenced by emitLibraryCall().
|
static |
Definition at line 151 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CGBuilderTy::CreateMemSet(), clang::CodeGen::CodeGenFunction::getLangOpts(), clang::CodeGen::CodeGenModule::getLLVMContext(), clang::CodeGen::initializationPatternFor(), clang::LangOptionsBase::Pattern, clang::CodeGen::CodeGenModule::stopAutoInit(), clang::LangOptionsBase::Uninitialized, and clang::LangOptionsBase::Zero.
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Determine if a binop is a checked mixed-sign multiply we can specialize.
Definition at line 2353 of file CGBuiltin.cpp.
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr(), and EmitCheckedMixedSignMultiply().
|
static |
Definition at line 2311 of file CGBuiltin.cpp.
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr(), and EmitCheckedUnsignedMultiplySignedResult().
Value * MakeAtomicCmpXchgValue | ( | CodeGenFunction & | CGF, |
const CallExpr * | E, | ||
bool | ReturnBool | ||
) |
Utility to insert an atomic cmpxchg instruction.
CGF | The current codegen function. |
E | Builtin call expression to convert to cmpxchg. arg0 - address to operate on arg1 - value to compare with arg2 - new value |
ReturnBool | Specifies whether to return success flag of cmpxchg result or the old value. |
Note: In order to lower Microsoft's _InterlockedCompareExchange* intrinsics invoke the function EmitAtomicCmpXchgForMSIntrin.
Definition at line 390 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, CheckAtomicAlignment(), clang::CodeGen::CodeGenFunction::ConvertType(), clang::CodeGen::CGBuilderTy::CreateAtomicCmpXchg(), E, EmitFromInt(), clang::CodeGen::CodeGenFunction::EmitScalarExpr(), EmitToInt(), clang::CodeGen::CodeGenFunction::getContext(), clang::CodeGen::CodeGenFunction::getLLVMContext(), clang::Expr::getType(), clang::ASTContext::getTypeSize(), New, and clang::T.
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr(), and clang::CodeGen::CodeGenFunction::EmitNVPTXBuiltinExpr().
Value * MakeBinaryAtomicValue | ( | CodeGenFunction & | CGF, |
llvm::AtomicRMWInst::BinOp | Kind, | ||
const CallExpr * | E, | ||
AtomicOrdering | Ordering | ||
) |
Utility to insert an atomic instruction based on Intrinsic::ID and the expression node.
Definition at line 293 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, CheckAtomicAlignment(), clang::CodeGen::CGBuilderTy::CreateAtomicRMW(), E, EmitFromInt(), clang::CodeGen::CodeGenFunction::EmitScalarExpr(), EmitToInt(), clang::CodeGen::CodeGenFunction::getContext(), clang::CodeGen::CodeGenFunction::getLLVMContext(), clang::Type::getPointeeType(), clang::Expr::getType(), clang::ASTContext::getTypeSize(), clang::ASTContext::hasSameUnqualifiedType(), clang::Type::isPointerType(), clang::Result, and clang::T.
Referenced by EmitBinaryAtomic(), clang::CodeGen::CodeGenFunction::EmitMSVCBuiltinExpr(), clang::CodeGen::CodeGenFunction::EmitNVPTXBuiltinExpr(), and clang::CodeGen::CodeGenFunction::EmitPPCBuiltinExpr().
Definition at line 2504 of file CGBuiltin.cpp.
References acos, acosh, asin, asinh, atan, atan2, atanh, cbrt, ceil, copysign, cos, cosh, erf, erfc, exp, exp2, expm1, fabs, fdim, floor, fma, fmax, fmin, fmod, frexp, hypot, ilogb, ldexp, lgamma, llrint, llround, log, log10, log1p, log2, logb, lrint, lround, modf(), MUTATE_LDBL, nan(), nearbyint, nextafter, nexttoward, pow, remainder, remquo, rint, round, scalbln, scalbn, sin, sinh, sqrt, tan, tanh, tgamma, and trunc.
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Some builtins do not have library implementation on some targets and are instead emitted as LLVM IRs by some target builtin emitters.
FIXME: Remove this when library support is added
Definition at line 48 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CodeGenFunction::CurFPFeatures, clang::FPOptions::getExceptionMode(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::CodeGen::CodeGenModule::getTargetCodeGenInfo(), and clang::CodeGen::TargetCodeGenInfo::supportsLibCall().
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Definition at line 2575 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CodeGenFunction::getTargetHooks(), clang::Result, clang::CodeGen::TargetCodeGenInfo::testFPKind(), and V.
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Determine if the specified type requires laundering by checking if it is a dynamic class type or contains a subobject which is a dynamic class type.
Definition at line 2481 of file CGBuiltin.cpp.
References clang::CodeGen::CodeGenModule::getCodeGenOpts(), clang::CodeGen::CodeGenModule::getContext(), and TypeRequiresBuiltinLaunderImp().
Referenced by clang::CodeGen::CodeGenFunction::EmitBuiltinExpr().
|
static |
Definition at line 2453 of file CGBuiltin.cpp.
References clang::ASTContext::getAsArrayType(), clang::Type::getAsCXXRecordDecl(), clang::ASTContext::getBaseElementType(), and TypeRequiresBuiltinLaunderImp().
Referenced by TypeRequiresBuiltinLaunder(), and TypeRequiresBuiltinLaunderImp().