#include "ABIInfoImpl.h"
#include "CGCUDARuntime.h"
#include "CGCXXABI.h"
#include "CGCall.h"
#include "CGCleanup.h"
#include "CGDebugInfo.h"
#include "CGObjCRuntime.h"
#include "CGOpenMPRuntime.h"
#include "CGRecordLayout.h"
#include "CodeGenFunction.h"
#include "CodeGenModule.h"
#include "ConstantEmitter.h"
#include "TargetInfo.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/Attr.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/NSAPI.h"
#include "clang/AST/StmtVisitor.h"
#include "clang/Basic/Builtins.h"
#include "clang/Basic/CodeGenOptions.h"
#include "clang/Basic/SourceManager.h"
#include "llvm/ADT/Hashing.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/ScopeExit.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/IntrinsicsWebAssembly.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/MDBuilder.h"
#include "llvm/IR/MatrixBuilder.h"
#include "llvm/Passes/OptimizationLevel.h"
#include "llvm/Support/ConvertUTF.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/SaveAndRestore.h"
#include "llvm/Support/xxhash.h"
#include "llvm/Transforms/Utils/SanitizerStats.h"
#include <optional>
#include <string>
usingnamespaceclang;
usingnamespaceCodeGen;
static llvm::cl::opt<bool> ClSanitizeDebugDeoptimization(
"ubsan-unique-traps", llvm::cl::Optional,
llvm::cl::desc("Deoptimize traps for UBSAN so there is 1 trap per check."));
static llvm::cl::opt<bool> ClSanitizeGuardChecks(
"ubsan-guard-checks", llvm::cl::Optional,
llvm::cl::desc("Guard UBSAN checks with `llvm.allow.ubsan.check()`."));
enum VariableTypeDescriptorKind : uint16_t { … };
RawAddress
CodeGenFunction::CreateTempAllocaWithoutCast(llvm::Type *Ty, CharUnits Align,
const Twine &Name,
llvm::Value *ArraySize) { … }
RawAddress CodeGenFunction::CreateTempAlloca(llvm::Type *Ty, CharUnits Align,
const Twine &Name,
llvm::Value *ArraySize,
RawAddress *AllocaAddr) { … }
llvm::AllocaInst *CodeGenFunction::CreateTempAlloca(llvm::Type *Ty,
const Twine &Name,
llvm::Value *ArraySize) { … }
RawAddress CodeGenFunction::CreateDefaultAlignTempAlloca(llvm::Type *Ty,
const Twine &Name) { … }
RawAddress CodeGenFunction::CreateIRTemp(QualType Ty, const Twine &Name) { … }
RawAddress CodeGenFunction::CreateMemTemp(QualType Ty, const Twine &Name,
RawAddress *Alloca) { … }
RawAddress CodeGenFunction::CreateMemTemp(QualType Ty, CharUnits Align,
const Twine &Name,
RawAddress *Alloca) { … }
RawAddress CodeGenFunction::CreateMemTempWithoutCast(QualType Ty,
CharUnits Align,
const Twine &Name) { … }
RawAddress CodeGenFunction::CreateMemTempWithoutCast(QualType Ty,
const Twine &Name) { … }
llvm::Value *CodeGenFunction::EvaluateExprAsBool(const Expr *E) { … }
void CodeGenFunction::EmitIgnoredExpr(const Expr *E) { … }
RValue CodeGenFunction::EmitAnyExpr(const Expr *E,
AggValueSlot aggSlot,
bool ignoreResult) { … }
RValue CodeGenFunction::EmitAnyExprToTemp(const Expr *E) { … }
void CodeGenFunction::EmitAnyExprToMem(const Expr *E,
Address Location,
Qualifiers Quals,
bool IsInit) { … }
void CodeGenFunction::EmitInitializationToLValue(
const Expr *E, LValue LV, AggValueSlot::IsZeroed_t IsZeroed) { … }
static void
pushTemporaryCleanup(CodeGenFunction &CGF, const MaterializeTemporaryExpr *M,
const Expr *E, Address ReferenceTemporary) { … }
static RawAddress createReferenceTemporary(CodeGenFunction &CGF,
const MaterializeTemporaryExpr *M,
const Expr *Inner,
RawAddress *Alloca = nullptr) { … }
static bool isAAPCS(const TargetInfo &TargetInfo) { … }
LValue CodeGenFunction::
EmitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *M) { … }
RValue
CodeGenFunction::EmitReferenceBindingToExpr(const Expr *E) { … }
unsigned CodeGenFunction::getAccessedFieldNo(unsigned Idx,
const llvm::Constant *Elts) { … }
static llvm::Value *emitHashMix(CGBuilderTy &Builder, llvm::Value *Acc,
llvm::Value *Ptr) { … }
bool CodeGenFunction::isNullPointerAllowed(TypeCheckKind TCK) { … }
bool CodeGenFunction::isVptrCheckRequired(TypeCheckKind TCK, QualType Ty) { … }
bool CodeGenFunction::sanitizePerformTypeCheck() const { … }
void CodeGenFunction::EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc,
llvm::Value *Ptr, QualType Ty,
CharUnits Alignment,
SanitizerSet SkippedChecks,
llvm::Value *ArraySize) { … }
llvm::Value *CodeGenFunction::LoadPassedObjectSize(const Expr *E,
QualType EltTy) { … }
static llvm::Value *getArrayIndexingBound(CodeGenFunction &CGF,
const Expr *Base,
QualType &IndexedType,
LangOptions::StrictFlexArraysLevelKind
StrictFlexArraysLevel) { … }
namespace {
class StructAccessBase
: public ConstStmtVisitor<StructAccessBase, const Expr *> { … };
}
RecIndicesTy;
static bool getGEPIndicesToField(CodeGenFunction &CGF, const RecordDecl *RD,
const FieldDecl *Field,
RecIndicesTy &Indices) { … }
llvm::Value *CodeGenFunction::EmitLoadOfCountedByField(
const Expr *Base, const FieldDecl *FAMDecl, const FieldDecl *CountDecl) { … }
void CodeGenFunction::EmitBoundsCheck(const Expr *E, const Expr *Base,
llvm::Value *Index, QualType IndexType,
bool Accessed) { … }
void CodeGenFunction::EmitBoundsCheckImpl(const Expr *E, llvm::Value *Bound,
llvm::Value *Index,
QualType IndexType,
QualType IndexedType, bool Accessed) { … }
CodeGenFunction::ComplexPairTy CodeGenFunction::
EmitComplexPrePostIncDec(const UnaryOperator *E, LValue LV,
bool isInc, bool isPre) { … }
void CodeGenModule::EmitExplicitCastExprType(const ExplicitCastExpr *E,
CodeGenFunction *CGF) { … }
static Address EmitPointerWithAlignment(const Expr *E, LValueBaseInfo *BaseInfo,
TBAAAccessInfo *TBAAInfo,
KnownNonNull_t IsKnownNonNull,
CodeGenFunction &CGF) { … }
Address CodeGenFunction::EmitPointerWithAlignment(
const Expr *E, LValueBaseInfo *BaseInfo, TBAAAccessInfo *TBAAInfo,
KnownNonNull_t IsKnownNonNull) { … }
llvm::Value *CodeGenFunction::EmitNonNullRValueCheck(RValue RV, QualType T) { … }
RValue CodeGenFunction::GetUndefRValue(QualType Ty) { … }
RValue CodeGenFunction::EmitUnsupportedRValue(const Expr *E,
const char *Name) { … }
LValue CodeGenFunction::EmitUnsupportedLValue(const Expr *E,
const char *Name) { … }
bool CodeGenFunction::IsWrappedCXXThis(const Expr *Obj) { … }
LValue CodeGenFunction::EmitCheckedLValue(const Expr *E, TypeCheckKind TCK) { … }
LValue CodeGenFunction::EmitLValue(const Expr *E,
KnownNonNull_t IsKnownNonNull) { … }
static QualType getConstantExprReferredType(const FullExpr *E,
const ASTContext &Ctx) { … }
LValue CodeGenFunction::EmitLValueHelper(const Expr *E,
KnownNonNull_t IsKnownNonNull) { … }
static bool isConstantEmittableObjectType(QualType type) { … }
enum ConstantEmissionKind { … };
static ConstantEmissionKind checkVarTypeForConstantEmission(QualType type) { … }
CodeGenFunction::ConstantEmission
CodeGenFunction::tryEmitAsConstant(DeclRefExpr *refExpr) { … }
static DeclRefExpr *tryToConvertMemberExprToDeclRefExpr(CodeGenFunction &CGF,
const MemberExpr *ME) { … }
CodeGenFunction::ConstantEmission
CodeGenFunction::tryEmitAsConstant(const MemberExpr *ME) { … }
llvm::Value *CodeGenFunction::emitScalarConstant(
const CodeGenFunction::ConstantEmission &Constant, Expr *E) { … }
llvm::Value *CodeGenFunction::EmitLoadOfScalar(LValue lvalue,
SourceLocation Loc) { … }
static bool hasBooleanRepresentation(QualType Ty) { … }
static bool getRangeForType(CodeGenFunction &CGF, QualType Ty,
llvm::APInt &Min, llvm::APInt &End,
bool StrictEnums, bool IsBool) { … }
llvm::MDNode *CodeGenFunction::getRangeForLoadFromType(QualType Ty) { … }
bool CodeGenFunction::EmitScalarRangeCheck(llvm::Value *Value, QualType Ty,
SourceLocation Loc) { … }
llvm::Value *CodeGenFunction::EmitLoadOfScalar(Address Addr, bool Volatile,
QualType Ty,
SourceLocation Loc,
LValueBaseInfo BaseInfo,
TBAAAccessInfo TBAAInfo,
bool isNontemporal) { … }
llvm::Value *CodeGenFunction::EmitToMemory(llvm::Value *Value, QualType Ty) { … }
llvm::Value *CodeGenFunction::EmitFromMemory(llvm::Value *Value, QualType Ty) { … }
static RawAddress MaybeConvertMatrixAddress(RawAddress Addr,
CodeGenFunction &CGF,
bool IsVector = true) { … }
static void EmitStoreOfMatrixScalar(llvm::Value *value, LValue lvalue,
bool isInit, CodeGenFunction &CGF) { … }
void CodeGenFunction::EmitStoreOfScalar(llvm::Value *Value, Address Addr,
bool Volatile, QualType Ty,
LValueBaseInfo BaseInfo,
TBAAAccessInfo TBAAInfo,
bool isInit, bool isNontemporal) { … }
void CodeGenFunction::EmitStoreOfScalar(llvm::Value *value, LValue lvalue,
bool isInit) { … }
static RValue EmitLoadOfMatrixLValue(LValue LV, SourceLocation Loc,
CodeGenFunction &CGF) { … }
RValue CodeGenFunction::EmitLoadOfAnyValue(LValue LV, AggValueSlot Slot,
SourceLocation Loc) { … }
RValue CodeGenFunction::EmitLoadOfLValue(LValue LV, SourceLocation Loc) { … }
RValue CodeGenFunction::EmitLoadOfBitfieldLValue(LValue LV,
SourceLocation Loc) { … }
RValue CodeGenFunction::EmitLoadOfExtVectorElementLValue(LValue LV) { … }
Address CodeGenFunction::EmitExtVectorElementLValue(LValue LV) { … }
RValue CodeGenFunction::EmitLoadOfGlobalRegLValue(LValue LV) { … }
void CodeGenFunction::EmitStoreThroughLValue(RValue Src, LValue Dst,
bool isInit) { … }
void CodeGenFunction::EmitStoreThroughBitfieldLValue(RValue Src, LValue Dst,
llvm::Value **Result) { … }
void CodeGenFunction::EmitStoreThroughExtVectorComponentLValue(RValue Src,
LValue Dst) { … }
void CodeGenFunction::EmitStoreThroughGlobalRegLValue(RValue Src, LValue Dst) { … }
static void setObjCGCLValueClass(const ASTContext &Ctx, const Expr *E,
LValue &LV,
bool IsMemberAccess=false) { … }
static LValue EmitThreadPrivateVarDeclLValue(
CodeGenFunction &CGF, const VarDecl *VD, QualType T, Address Addr,
llvm::Type *RealVarTy, SourceLocation Loc) { … }
static Address emitDeclTargetVarDeclLValue(CodeGenFunction &CGF,
const VarDecl *VD, QualType T) { … }
Address
CodeGenFunction::EmitLoadOfReference(LValue RefLVal,
LValueBaseInfo *PointeeBaseInfo,
TBAAAccessInfo *PointeeTBAAInfo) { … }
LValue CodeGenFunction::EmitLoadOfReferenceLValue(LValue RefLVal) { … }
Address CodeGenFunction::EmitLoadOfPointer(Address Ptr,
const PointerType *PtrTy,
LValueBaseInfo *BaseInfo,
TBAAAccessInfo *TBAAInfo) { … }
LValue CodeGenFunction::EmitLoadOfPointerLValue(Address PtrAddr,
const PointerType *PtrTy) { … }
static LValue EmitGlobalVarDeclLValue(CodeGenFunction &CGF,
const Expr *E, const VarDecl *VD) { … }
llvm::Constant *CodeGenModule::getRawFunctionPointer(GlobalDecl GD,
llvm::Type *Ty) { … }
static LValue EmitFunctionDeclLValue(CodeGenFunction &CGF, const Expr *E,
GlobalDecl GD) { … }
static LValue EmitCapturedFieldLValue(CodeGenFunction &CGF, const FieldDecl *FD,
llvm::Value *ThisValue) { … }
static LValue EmitGlobalNamedRegister(const VarDecl *VD, CodeGenModule &CGM) { … }
static bool canEmitSpuriousReferenceToVariable(CodeGenFunction &CGF,
const DeclRefExpr *E,
const VarDecl *VD) { … }
LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) { … }
LValue CodeGenFunction::EmitUnaryOpLValue(const UnaryOperator *E) { … }
LValue CodeGenFunction::EmitStringLiteralLValue(const StringLiteral *E) { … }
LValue CodeGenFunction::EmitObjCEncodeExprLValue(const ObjCEncodeExpr *E) { … }
LValue CodeGenFunction::EmitPredefinedLValue(const PredefinedExpr *E) { … }
llvm::Constant *CodeGenFunction::EmitCheckTypeDescriptor(QualType T) { … }
llvm::Value *CodeGenFunction::EmitCheckValue(llvm::Value *V) { … }
llvm::Constant *CodeGenFunction::EmitCheckSourceLocation(SourceLocation Loc) { … }
namespace {
enum class CheckRecoverableKind { … };
}
static CheckRecoverableKind getRecoverableKind(SanitizerMask Kind) { … }
namespace {
struct SanitizerHandlerInfo { … };
}
const SanitizerHandlerInfo SanitizerHandlers[] = …;
static void emitCheckHandlerCall(CodeGenFunction &CGF,
llvm::FunctionType *FnType,
ArrayRef<llvm::Value *> FnArgs,
SanitizerHandler CheckHandler,
CheckRecoverableKind RecoverKind, bool IsFatal,
llvm::BasicBlock *ContBB) { … }
void CodeGenFunction::EmitCheck(
ArrayRef<std::pair<llvm::Value *, SanitizerMask>> Checked,
SanitizerHandler CheckHandler, ArrayRef<llvm::Constant *> StaticArgs,
ArrayRef<llvm::Value *> DynamicArgs) { … }
void CodeGenFunction::EmitCfiSlowPathCheck(
SanitizerMask Kind, llvm::Value *Cond, llvm::ConstantInt *TypeId,
llvm::Value *Ptr, ArrayRef<llvm::Constant *> StaticArgs) { … }
void CodeGenFunction::EmitCfiCheckStub() { … }
void CodeGenFunction::EmitCfiCheckFail() { … }
void CodeGenFunction::EmitUnreachable(SourceLocation Loc) { … }
void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked,
SanitizerHandler CheckHandlerID) { … }
llvm::CallInst *CodeGenFunction::EmitTrapCall(llvm::Intrinsic::ID IntrID) { … }
Address CodeGenFunction::EmitArrayToPointerDecay(const Expr *E,
LValueBaseInfo *BaseInfo,
TBAAAccessInfo *TBAAInfo) { … }
static const Expr *isSimpleArrayDecayOperand(const Expr *E) { … }
static llvm::Value *emitArraySubscriptGEP(CodeGenFunction &CGF,
llvm::Type *elemType,
llvm::Value *ptr,
ArrayRef<llvm::Value*> indices,
bool inbounds,
bool signedIndices,
SourceLocation loc,
const llvm::Twine &name = "arrayidx") { … }
static Address emitArraySubscriptGEP(CodeGenFunction &CGF, Address addr,
ArrayRef<llvm::Value *> indices,
llvm::Type *elementType, bool inbounds,
bool signedIndices, SourceLocation loc,
CharUnits align,
const llvm::Twine &name = "arrayidx") { … }
static CharUnits getArrayElementAlign(CharUnits arrayAlign,
llvm::Value *idx,
CharUnits eltSize) { … }
static QualType getFixedSizeElementType(const ASTContext &ctx,
const VariableArrayType *vla) { … }
static bool hasBPFPreserveStaticOffset(const RecordDecl *D) { … }
static bool hasBPFPreserveStaticOffset(const Expr *E) { … }
static Address wrapWithBPFPreserveStaticOffset(CodeGenFunction &CGF,
Address &Addr) { … }
static bool IsPreserveAIArrayBase(CodeGenFunction &CGF, const Expr *ArrayBase) { … }
static Address emitArraySubscriptGEP(CodeGenFunction &CGF, Address addr,
ArrayRef<llvm::Value *> indices,
QualType eltType, bool inbounds,
bool signedIndices, SourceLocation loc,
QualType *arrayType = nullptr,
const Expr *Base = nullptr,
const llvm::Twine &name = "arrayidx") { … }
static bool getFieldOffsetInBits(CodeGenFunction &CGF, const RecordDecl *RD,
const FieldDecl *Field, int64_t &Offset) { … }
static std::optional<int64_t> getOffsetDifferenceInBits(CodeGenFunction &CGF,
const FieldDecl *FD1,
const FieldDecl *FD2) { … }
LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E,
bool Accessed) { … }
llvm::Value *CodeGenFunction::EmitMatrixIndexExpr(const Expr *E) { … }
LValue CodeGenFunction::EmitMatrixSubscriptExpr(const MatrixSubscriptExpr *E) { … }
static Address emitOMPArraySectionBase(CodeGenFunction &CGF, const Expr *Base,
LValueBaseInfo &BaseInfo,
TBAAAccessInfo &TBAAInfo,
QualType BaseTy, QualType ElTy,
bool IsLowerBound) { … }
LValue CodeGenFunction::EmitArraySectionExpr(const ArraySectionExpr *E,
bool IsLowerBound) { … }
LValue CodeGenFunction::
EmitExtVectorElementExpr(const ExtVectorElementExpr *E) { … }
LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) { … }
LValue CodeGenFunction::EmitLValueForLambdaField(const FieldDecl *Field,
llvm::Value *ThisValue) { … }
LValue CodeGenFunction::EmitLValueForLambdaField(const FieldDecl *Field) { … }
unsigned CodeGenFunction::getDebugInfoFIndex(const RecordDecl *Rec,
unsigned FieldIndex) { … }
static Address emitAddrOfZeroSizeField(CodeGenFunction &CGF, Address Base,
const FieldDecl *Field) { … }
static Address emitAddrOfFieldStorage(CodeGenFunction &CGF, Address base,
const FieldDecl *field) { … }
static Address emitPreserveStructAccess(CodeGenFunction &CGF, LValue base,
Address addr, const FieldDecl *field) { … }
static bool hasAnyVptr(const QualType Type, const ASTContext &Context) { … }
LValue CodeGenFunction::EmitLValueForField(LValue base,
const FieldDecl *field) { … }
LValue
CodeGenFunction::EmitLValueForFieldInitialization(LValue Base,
const FieldDecl *Field) { … }
LValue CodeGenFunction::EmitCompoundLiteralLValue(const CompoundLiteralExpr *E){ … }
LValue CodeGenFunction::EmitInitListLValue(const InitListExpr *E) { … }
static std::optional<LValue> EmitLValueOrThrowExpression(CodeGenFunction &CGF,
const Expr *Operand) { … }
namespace {
std::optional<LValue> HandleConditionalOperatorLValueSimpleCase(
CodeGenFunction &CGF, const AbstractConditionalOperator *E) { … }
struct ConditionalInfo { … };
template<typename FuncTy>
ConditionalInfo EmitConditionalBlocks(CodeGenFunction &CGF,
const AbstractConditionalOperator *E,
const FuncTy &BranchGenFunc) { … }
}
void CodeGenFunction::EmitIgnoredConditionalOperator(
const AbstractConditionalOperator *E) { … }
LValue CodeGenFunction::EmitConditionalOperatorLValue(
const AbstractConditionalOperator *expr) { … }
LValue CodeGenFunction::EmitCastLValue(const CastExpr *E) { … }
LValue CodeGenFunction::EmitOpaqueValueLValue(const OpaqueValueExpr *e) { … }
void CodeGenFunction::EmitHLSLOutArgExpr(const HLSLOutArgExpr *E,
CallArgList &Args, QualType Ty) { … }
LValue
CodeGenFunction::getOrCreateOpaqueLValueMapping(const OpaqueValueExpr *e) { … }
RValue
CodeGenFunction::getOrCreateOpaqueRValueMapping(const OpaqueValueExpr *e) { … }
RValue CodeGenFunction::EmitRValueForField(LValue LV,
const FieldDecl *FD,
SourceLocation Loc) { … }
RValue CodeGenFunction::EmitCallExpr(const CallExpr *E,
ReturnValueSlot ReturnValue,
llvm::CallBase **CallOrInvoke) { … }
RValue CodeGenFunction::EmitSimpleCallExpr(const CallExpr *E,
ReturnValueSlot ReturnValue,
llvm::CallBase **CallOrInvoke) { … }
static bool OnlyHasInlineBuiltinDeclaration(const FunctionDecl *FD) { … }
static CGCallee EmitDirectCallee(CodeGenFunction &CGF, GlobalDecl GD) { … }
CGCallee CodeGenFunction::EmitCallee(const Expr *E) { … }
LValue CodeGenFunction::EmitBinaryOperatorLValue(const BinaryOperator *E) { … }
LValue CodeGenFunction::EmitHLSLArrayAssignLValue(const BinaryOperator *E) { … }
LValue CodeGenFunction::EmitCallExprLValue(const CallExpr *E,
llvm::CallBase **CallOrInvoke) { … }
LValue CodeGenFunction::EmitVAArgExprLValue(const VAArgExpr *E) { … }
LValue CodeGenFunction::EmitCXXConstructLValue(const CXXConstructExpr *E) { … }
LValue
CodeGenFunction::EmitCXXTypeidLValue(const CXXTypeidExpr *E) { … }
Address CodeGenFunction::EmitCXXUuidofExpr(const CXXUuidofExpr *E) { … }
LValue CodeGenFunction::EmitCXXUuidofLValue(const CXXUuidofExpr *E) { … }
LValue
CodeGenFunction::EmitCXXBindTemporaryLValue(const CXXBindTemporaryExpr *E) { … }
LValue CodeGenFunction::EmitObjCMessageExprLValue(const ObjCMessageExpr *E) { … }
LValue CodeGenFunction::EmitObjCSelectorLValue(const ObjCSelectorExpr *E) { … }
llvm::Value *CodeGenFunction::EmitIvarOffset(const ObjCInterfaceDecl *Interface,
const ObjCIvarDecl *Ivar) { … }
llvm::Value *
CodeGenFunction::EmitIvarOffsetAsPointerDiff(const ObjCInterfaceDecl *Interface,
const ObjCIvarDecl *Ivar) { … }
LValue CodeGenFunction::EmitLValueForIvar(QualType ObjectTy,
llvm::Value *BaseValue,
const ObjCIvarDecl *Ivar,
unsigned CVRQualifiers) { … }
LValue CodeGenFunction::EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E) { … }
LValue CodeGenFunction::EmitStmtExprLValue(const StmtExpr *E) { … }
RValue CodeGenFunction::EmitCall(QualType CalleeType,
const CGCallee &OrigCallee, const CallExpr *E,
ReturnValueSlot ReturnValue,
llvm::Value *Chain,
llvm::CallBase **CallOrInvoke,
CGFunctionInfo const **ResolvedFnInfo) { … }
LValue CodeGenFunction::
EmitPointerToDataMemberBinaryExpr(const BinaryOperator *E) { … }
RValue CodeGenFunction::convertTempToRValue(Address addr,
QualType type,
SourceLocation loc) { … }
void CodeGenFunction::SetFPAccuracy(llvm::Value *Val, float Accuracy) { … }
void CodeGenFunction::SetSqrtFPAccuracy(llvm::Value *Val) { … }
void CodeGenFunction::SetDivFPAccuracy(llvm::Value *Val) { … }
namespace {
struct LValueOrRValue { … };
}
static LValueOrRValue emitPseudoObjectExpr(CodeGenFunction &CGF,
const PseudoObjectExpr *E,
bool forLValue,
AggValueSlot slot) { … }
RValue CodeGenFunction::EmitPseudoObjectRValue(const PseudoObjectExpr *E,
AggValueSlot slot) { … }
LValue CodeGenFunction::EmitPseudoObjectLValue(const PseudoObjectExpr *E) { … }