clang 23.0.0git
CIRGenBuiltin.cpp File Reference
#include "CIRGenCall.h"
#include "CIRGenFunction.h"
#include "CIRGenModule.h"
#include "CIRGenValue.h"
#include "mlir/IR/BuiltinAttributes.h"
#include "mlir/IR/Value.h"
#include "mlir/Support/LLVM.h"
#include "clang/AST/DeclBase.h"
#include "clang/AST/Expr.h"
#include "clang/AST/GlobalDecl.h"
#include "clang/Basic/Builtins.h"
#include "clang/Basic/DiagnosticFrontend.h"
#include "clang/Basic/OperatorKinds.h"
#include "clang/CIR/Dialect/IR/CIRTypes.h"
#include "clang/CIR/MissingFeatures.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/Support/ErrorHandling.h"

Go to the source code of this file.

Functions

static RValue emitLibraryCall (CIRGenFunction &cgf, const FunctionDecl *fd, const CallExpr *e, mlir::Operation *calleeValue)
template<typename Op>
static RValue emitBuiltinBitOp (CIRGenFunction &cgf, const CallExpr *e, bool poisonZero=false)
static mlir::Value emitToInt (CIRGenFunction &cgf, mlir::Value v, QualType t, cir::IntType intType)
 Emit the conversions required to turn the given value into an integer of the given size.
static mlir::Value emitFromInt (CIRGenFunction &cgf, mlir::Value v, QualType t, mlir::Type resultType)
static Address checkAtomicAlignment (CIRGenFunction &cgf, const CallExpr *e)
static mlir::Value makeBinaryAtomicValue (CIRGenFunction &cgf, cir::AtomicFetchKind kind, const CallExpr *expr, mlir::Type *originalArgType, mlir::Value *emittedArgValue=nullptr, cir::MemOrder ordering=cir::MemOrder::SequentiallyConsistent)
 Utility to insert an atomic instruction based on Intrinsic::ID and the expression node.
static RValue emitBinaryAtomicPost (CIRGenFunction &cgf, cir::AtomicFetchKind atomicOpkind, const CallExpr *e, cir::BinOpKind binopKind, bool invert=false)
static void emitAtomicFenceOp (CIRGenFunction &cgf, const CallExpr *expr, cir::SyncScopeKind syncScope)
static WidthAndSignedness getIntegerWidthAndSignedness (const clang::ASTContext &astContext, const clang::QualType type)
static struct WidthAndSignedness EncompassingIntegerType (ArrayRef< struct WidthAndSignedness > types)
template<class Operation>
static RValue emitUnaryMaybeConstrainedFPBuiltin (CIRGenFunction &cgf, const CallExpr &e)
template<class Operation>
static RValue emitUnaryFPBuiltin (CIRGenFunction &cgf, const CallExpr &e)
template<typename Op>
static RValue emitUnaryMaybeConstrainedFPToIntBuiltin (CIRGenFunction &cgf, const CallExpr &e)
template<typename Op>
static RValue emitBinaryFPBuiltin (CIRGenFunction &cgf, const CallExpr &e)
template<typename Op>
static mlir::Value emitBinaryMaybeConstrainedFPBuiltin (CIRGenFunction &cgf, const CallExpr &e)
static RValue errorBuiltinNYI (CIRGenFunction &cgf, const CallExpr *e, unsigned builtinID)
static RValue emitBuiltinAlloca (CIRGenFunction &cgf, const CallExpr *e, unsigned builtinID)
static bool shouldCIREmitFPMathIntrinsic (CIRGenFunction &cgf, const CallExpr *e, unsigned builtinID)
static RValue tryEmitFPMathIntrinsic (CIRGenFunction &cgf, const CallExpr *e, unsigned builtinID)
static mlir::Type decodeFixedType (CIRGenFunction &cgf, ArrayRef< llvm::Intrinsic::IITDescriptor > &infos, mlir::MLIRContext *context)
static mlir::Type correctIntegerSignedness (mlir::Type iitType, QualType astType, mlir::MLIRContext *context)
 Helper function to correct integer signedness for intrinsic arguments and return type.
static mlir::Value getCorrectedPtr (mlir::Value argValue, mlir::Type expectedTy, CIRGenBuilderTy &builder)
static cir::FuncType getIntrinsicType (CIRGenFunction &cgf, mlir::MLIRContext *context, llvm::Intrinsic::ID id)
static std::optional< mlir::ValueemitTargetArchBuiltinExpr (CIRGenFunction *cgf, unsigned builtinID, const CallExpr *e, ReturnValueSlot &returnValue, llvm::Triple::ArchType arch)

Function Documentation

◆ checkAtomicAlignment()

◆ correctIntegerSignedness()

mlir::Type correctIntegerSignedness ( mlir::Type iitType,
QualType astType,
mlir::MLIRContext * context )
static

Helper function to correct integer signedness for intrinsic arguments and return type.

IIT always returns signed integers, but the actual intrinsic may expect unsigned integers based on the AST FunctionDecl parameter types.

Definition at line 840 of file CIRGenBuiltin.cpp.

References clang::Type::isUnsignedIntegerType().

Referenced by clang::CIRGen::CIRGenFunction::emitBuiltinExpr().

◆ decodeFixedType()

mlir::Type decodeFixedType ( CIRGenFunction & cgf,
ArrayRef< llvm::Intrinsic::IITDescriptor > & infos,
mlir::MLIRContext * context )
static

◆ emitAtomicFenceOp()

◆ emitBinaryAtomicPost()

RValue emitBinaryAtomicPost ( CIRGenFunction & cgf,
cir::AtomicFetchKind atomicOpkind,
const CallExpr * e,
cir::BinOpKind binopKind,
bool invert = false )
static

◆ emitBinaryFPBuiltin()

◆ emitBinaryMaybeConstrainedFPBuiltin()

◆ emitBuiltinAlloca()

◆ emitBuiltinBitOp()

◆ emitFromInt()

◆ emitLibraryCall()

◆ emitTargetArchBuiltinExpr()

◆ emitToInt()

mlir::Value emitToInt ( CIRGenFunction & cgf,
mlir::Value v,
QualType t,
cir::IntType intType )
static

Emit the conversions required to turn the given value into an integer of the given size.

Definition at line 67 of file CIRGenBuiltin.cpp.

References cir::CIRBaseBuilderTy::createPtrToInt(), clang::CIRGen::CIRGenFunction::emitToMemory(), and clang::CIRGen::CIRGenFunction::getBuilder().

Referenced by makeBinaryAtomicValue().

◆ emitUnaryFPBuiltin()

◆ emitUnaryMaybeConstrainedFPBuiltin()

◆ emitUnaryMaybeConstrainedFPToIntBuiltin()

◆ EncompassingIntegerType()

struct WidthAndSignedness EncompassingIntegerType ( ArrayRef< struct WidthAndSignedness > types)
static

◆ errorBuiltinNYI()

◆ getCorrectedPtr()

◆ getIntegerWidthAndSignedness()

◆ getIntrinsicType()

cir::FuncType getIntrinsicType ( CIRGenFunction & cgf,
mlir::MLIRContext * context,
llvm::Intrinsic::ID id )
static

Definition at line 870 of file CIRGenBuiltin.cpp.

References decodeFixedType(), clang::isa(), and kind.

Referenced by clang::CIRGen::CIRGenFunction::emitBuiltinExpr().

◆ makeBinaryAtomicValue()

◆ shouldCIREmitFPMathIntrinsic()

◆ tryEmitFPMathIntrinsic()