diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.h')
| -rw-r--r-- | contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.h | 176 | 
1 files changed, 98 insertions, 78 deletions
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.h b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.h index 89cb850ab1b1..c3060d1fb351 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.h +++ b/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.h @@ -1,9 +1,8 @@  //===-- CodeGenFunction.h - Per-Function state for LLVM CodeGen -*- C++ -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception  //  //===----------------------------------------------------------------------===//  // @@ -23,6 +22,7 @@  #include "EHScopeStack.h"  #include "VarBypassDetector.h"  #include "clang/AST/CharUnits.h" +#include "clang/AST/CurrentSourceLocExprScope.h"  #include "clang/AST/ExprCXX.h"  #include "clang/AST/ExprObjC.h"  #include "clang/AST/ExprOpenMP.h" @@ -48,7 +48,6 @@ class Module;  class SwitchInst;  class Twine;  class Value; -class CallSite;  }  namespace clang { @@ -115,7 +114,7 @@ enum TypeEvaluationKind {    SANITIZER_CHECK(DivremOverflow, divrem_overflow, 0)                          \    SANITIZER_CHECK(DynamicTypeCacheMiss, dynamic_type_cache_miss, 0)            \    SANITIZER_CHECK(FloatCastOverflow, float_cast_overflow, 0)                   \ -  SANITIZER_CHECK(FunctionTypeMismatch, function_type_mismatch, 0)             \ +  SANITIZER_CHECK(FunctionTypeMismatch, function_type_mismatch, 1)             \    SANITIZER_CHECK(ImplicitConversion, implicit_conversion, 0)                  \    SANITIZER_CHECK(InvalidBuiltin, invalid_builtin, 0)                          \    SANITIZER_CHECK(LoadInvalidValue, load_invalid_value, 0)                     \ @@ -328,6 +327,10 @@ public:    /// value. This is invalid iff the function has no return value.    Address ReturnValue = Address::invalid(); +  /// ReturnValuePointer - The temporary alloca to hold a pointer to sret. +  /// This is invalid if sret is not in use. +  Address ReturnValuePointer = Address::invalid(); +    /// Return true if a label was seen in the current scope.    bool hasLabelBeenSeenInCurrentScope() const {      if (CurLexicalScope) @@ -477,6 +480,10 @@ public:    /// finally block or filter expression.    bool IsOutlinedSEHHelper = false; +  /// True if CodeGen currently emits code inside presereved access index +  /// region. +  bool IsInPreservedAIRegion = false; +    const CodeGen::CGBlockInfo *BlockInfo = nullptr;    llvm::Value *BlockPointer = nullptr; @@ -568,7 +575,7 @@ public:      JumpDest RethrowDest;      /// A function to call to enter the catch. -    llvm::Constant *BeginCatchFn; +    llvm::FunctionCallee BeginCatchFn;      /// An i1 variable indicating whether or not the @finally is      /// running for an exception. @@ -580,8 +587,8 @@ public:    public:      void enter(CodeGenFunction &CGF, const Stmt *Finally, -               llvm::Constant *beginCatchFn, llvm::Constant *endCatchFn, -               llvm::Constant *rethrowFn); +               llvm::FunctionCallee beginCatchFn, +               llvm::FunctionCallee endCatchFn, llvm::FunctionCallee rethrowFn);      void exit(CodeGenFunction &CGF);    }; @@ -668,7 +675,8 @@ public:    /// PushDestructorCleanup - Push a cleanup to call the    /// complete-object variant of the given destructor on the object at    /// the given address. -  void PushDestructorCleanup(const CXXDestructorDecl *Dtor, Address Addr); +  void PushDestructorCleanup(const CXXDestructorDecl *Dtor, QualType T, +                             Address Addr);    /// PopCleanupBlock - Will pop the cleanup entry on the stack and    /// process all branch fixups. @@ -1395,6 +1403,12 @@ private:    SourceLocation LastStopPoint;  public: +  /// Source location information about the default argument or member +  /// initializer expression we're evaluating, if any. +  CurrentSourceLocExprScope CurSourceLocExprScope; +  using SourceLocExprScopeGuard = +      CurrentSourceLocExprScope::SourceLocExprScopeGuard; +    /// A scope within which we are constructing the fields of an object which    /// might use a CXXDefaultInitExpr. This stashes away a 'this' value to use    /// if we need to evaluate a CXXDefaultInitExpr within the evaluation. @@ -1415,11 +1429,12 @@ public:    /// The scope of a CXXDefaultInitExpr. Within this scope, the value of 'this'    /// is overridden to be the object under construction. -  class CXXDefaultInitExprScope { +  class CXXDefaultInitExprScope  {    public: -    CXXDefaultInitExprScope(CodeGenFunction &CGF) -      : CGF(CGF), OldCXXThisValue(CGF.CXXThisValue), -        OldCXXThisAlignment(CGF.CXXThisAlignment) { +    CXXDefaultInitExprScope(CodeGenFunction &CGF, const CXXDefaultInitExpr *E) +        : CGF(CGF), OldCXXThisValue(CGF.CXXThisValue), +          OldCXXThisAlignment(CGF.CXXThisAlignment), +          SourceLocScope(E, CGF.CurSourceLocExprScope) {        CGF.CXXThisValue = CGF.CXXDefaultInitExprThis.getPointer();        CGF.CXXThisAlignment = CGF.CXXDefaultInitExprThis.getAlignment();      } @@ -1432,6 +1447,12 @@ public:      CodeGenFunction &CGF;      llvm::Value *OldCXXThisValue;      CharUnits OldCXXThisAlignment; +    SourceLocExprScopeGuard SourceLocScope; +  }; + +  struct CXXDefaultArgExprScope : SourceLocExprScopeGuard { +    CXXDefaultArgExprScope(CodeGenFunction &CGF, const CXXDefaultArgExpr *E) +        : SourceLocExprScopeGuard(E, CGF.CurSourceLocExprScope) {}    };    /// The scope of an ArrayInitLoopExpr. Within this scope, the value of the @@ -1836,6 +1857,9 @@ public:    void EmitLambdaBlockInvokeBody();    void EmitLambdaDelegatingInvokeBody(const CXXMethodDecl *MD);    void EmitLambdaStaticInvokeBody(const CXXMethodDecl *MD); +  void EmitLambdaVLACapture(const VariableArrayType *VAT, LValue LV) { +    EmitStoreThroughLValue(RValue::get(VLASizeMap[VAT->getSizeExpr()]), LV); +  }    void EmitAsanPrologueOrEpilogue(bool Prologue);    /// Emit the unified return block, trying to avoid its emission when @@ -1851,14 +1875,14 @@ public:    void StartThunk(llvm::Function *Fn, GlobalDecl GD,                    const CGFunctionInfo &FnInfo, bool IsUnprototyped); -  void EmitCallAndReturnForThunk(llvm::Constant *Callee, const ThunkInfo *Thunk, -                                 bool IsUnprototyped); +  void EmitCallAndReturnForThunk(llvm::FunctionCallee Callee, +                                 const ThunkInfo *Thunk, bool IsUnprototyped);    void FinishThunk();    /// Emit a musttail call for a thunk with a potentially adjusted this pointer.    void EmitMustTailThunk(GlobalDecl GD, llvm::Value *AdjustedThisPtr, -                         llvm::Value *Callee); +                         llvm::FunctionCallee Callee);    /// Generate a thunk for the given method.    void generateThunk(llvm::Function *Fn, const CGFunctionInfo &FnInfo, @@ -2295,7 +2319,7 @@ public:    }    /// Determine whether a return value slot may overlap some other object. -  AggValueSlot::Overlap_t overlapForReturnValue() { +  AggValueSlot::Overlap_t getOverlapForReturnValue() {      // FIXME: Assuming no overlap here breaks guaranteed copy elision for base      // class subobjects. These cases may need to be revisited depending on the      // resolution of the relevant core issue. @@ -2303,20 +2327,13 @@ public:    }    /// Determine whether a field initialization may overlap some other object. -  AggValueSlot::Overlap_t overlapForFieldInit(const FieldDecl *FD) { -    // FIXME: These cases can result in overlap as a result of P0840R0's -    // [[no_unique_address]] attribute. We can still infer NoOverlap in the -    // presence of that attribute if the field is within the nvsize of its -    // containing class, because non-virtual subobjects are initialized in -    // address order. -    return AggValueSlot::DoesNotOverlap; -  } +  AggValueSlot::Overlap_t getOverlapForFieldInit(const FieldDecl *FD);    /// Determine whether a base class initialization may overlap some other    /// object. -  AggValueSlot::Overlap_t overlapForBaseInit(const CXXRecordDecl *RD, -                                             const CXXRecordDecl *BaseRD, -                                             bool IsVirtual); +  AggValueSlot::Overlap_t getOverlapForBaseInit(const CXXRecordDecl *RD, +                                                const CXXRecordDecl *BaseRD, +                                                bool IsVirtual);    /// Emit an aggregate assignment.    void EmitAggregateAssign(LValue Dest, LValue Src, QualType EltTy) { @@ -2502,16 +2519,13 @@ public:    void EmitCXXConstructorCall(const CXXConstructorDecl *D, CXXCtorType Type,                                bool ForVirtualBase, bool Delegating, -                              Address This, const CXXConstructExpr *E, -                              AggValueSlot::Overlap_t Overlap, -                              bool NewPointerIsChecked); +                              AggValueSlot ThisAVS, const CXXConstructExpr *E);    void EmitCXXConstructorCall(const CXXConstructorDecl *D, CXXCtorType Type,                                bool ForVirtualBase, bool Delegating,                                Address This, CallArgList &Args,                                AggValueSlot::Overlap_t Overlap, -                              SourceLocation Loc, -                              bool NewPointerIsChecked); +                              SourceLocation Loc, bool NewPointerIsChecked);    /// Emit assumption load for all bases. Requires to be be called only on    /// most-derived class and not under construction of the object. @@ -2541,8 +2555,8 @@ public:    static Destroyer destroyCXXObject;    void EmitCXXDestructorCall(const CXXDestructorDecl *D, CXXDtorType Type, -                             bool ForVirtualBase, bool Delegating, -                             Address This); +                             bool ForVirtualBase, bool Delegating, Address This, +                             QualType ThisTy);    void EmitNewArrayInitializer(const CXXNewExpr *E, QualType elementType,                                 llvm::Type *ElementTy, Address NewPtr, @@ -2618,10 +2632,12 @@ public:    bool sanitizePerformTypeCheck() const;    /// Emit a check that \p V is the address of storage of the -  /// appropriate size and alignment for an object of type \p Type. +  /// appropriate size and alignment for an object of type \p Type +  /// (or if ArraySize is provided, for an array of that bound).    void EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc, llvm::Value *V,                       QualType Type, CharUnits Alignment = CharUnits::Zero(), -                     SanitizerSet SkippedChecks = SanitizerSet()); +                     SanitizerSet SkippedChecks = SanitizerSet(), +                     llvm::Value *ArraySize = nullptr);    /// Emit a check that \p Base points into an array object, which    /// we can access at index \p Index. \p Accessed should be \c false if we @@ -2637,6 +2653,9 @@ public:    /// Converts Location to a DebugLoc, if debug information is enabled.    llvm::DebugLoc SourceLocToDebugLoc(SourceLocation Location); +  /// Get the record field index as represented in debug info. +  unsigned getDebugInfoFIndex(const RecordDecl *Rec, unsigned FieldIndex); +    //===--------------------------------------------------------------------===//    //                            Declaration Emission @@ -3084,7 +3103,7 @@ public:    bool EmitOMPLinearClauseInit(const OMPLoopDirective &D);    typedef const llvm::function_ref<void(CodeGenFunction & /*CGF*/, -                                        llvm::Value * /*OutlinedFn*/, +                                        llvm::Function * /*OutlinedFn*/,                                          const OMPTaskDataTy & /*Data*/)>        TaskGenTy;    void EmitOMPTaskBasedDirective(const OMPExecutableDirective &S, @@ -3560,7 +3579,6 @@ public:    LValue EmitCXXConstructLValue(const CXXConstructExpr *E);    LValue EmitCXXBindTemporaryLValue(const CXXBindTemporaryExpr *E); -  LValue EmitLambdaLValue(const LambdaExpr *E);    LValue EmitCXXTypeidLValue(const CXXTypeidExpr *E);    LValue EmitCXXUuidofLValue(const CXXUuidofExpr *E); @@ -3580,10 +3598,10 @@ public:    /// LLVM arguments and the types they were derived from.    RValue EmitCall(const CGFunctionInfo &CallInfo, const CGCallee &Callee,                    ReturnValueSlot ReturnValue, const CallArgList &Args, -                  llvm::Instruction **callOrInvoke, SourceLocation Loc); +                  llvm::CallBase **callOrInvoke, SourceLocation Loc);    RValue EmitCall(const CGFunctionInfo &CallInfo, const CGCallee &Callee,                    ReturnValueSlot ReturnValue, const CallArgList &Args, -                  llvm::Instruction **callOrInvoke = nullptr) { +                  llvm::CallBase **callOrInvoke = nullptr) {      return EmitCall(CallInfo, Callee, ReturnValue, Args, callOrInvoke,                      SourceLocation());    } @@ -3595,31 +3613,32 @@ public:    CGCallee EmitCallee(const Expr *E);    void checkTargetFeatures(const CallExpr *E, const FunctionDecl *TargetDecl); +  void checkTargetFeatures(SourceLocation Loc, const FunctionDecl *TargetDecl); -  llvm::CallInst *EmitRuntimeCall(llvm::Value *callee, +  llvm::CallInst *EmitRuntimeCall(llvm::FunctionCallee callee,                                    const Twine &name = ""); -  llvm::CallInst *EmitRuntimeCall(llvm::Value *callee, -                                  ArrayRef<llvm::Value*> args, +  llvm::CallInst *EmitRuntimeCall(llvm::FunctionCallee callee, +                                  ArrayRef<llvm::Value *> args,                                    const Twine &name = ""); -  llvm::CallInst *EmitNounwindRuntimeCall(llvm::Value *callee, +  llvm::CallInst *EmitNounwindRuntimeCall(llvm::FunctionCallee callee,                                            const Twine &name = ""); -  llvm::CallInst *EmitNounwindRuntimeCall(llvm::Value *callee, -                                          ArrayRef<llvm::Value*> args, +  llvm::CallInst *EmitNounwindRuntimeCall(llvm::FunctionCallee callee, +                                          ArrayRef<llvm::Value *> args,                                            const Twine &name = "");    SmallVector<llvm::OperandBundleDef, 1>    getBundlesForFunclet(llvm::Value *Callee); -  llvm::CallSite EmitCallOrInvoke(llvm::Value *Callee, -                                  ArrayRef<llvm::Value *> Args, -                                  const Twine &Name = ""); -  llvm::CallSite EmitRuntimeCallOrInvoke(llvm::Value *callee, -                                         ArrayRef<llvm::Value*> args, -                                         const Twine &name = ""); -  llvm::CallSite EmitRuntimeCallOrInvoke(llvm::Value *callee, -                                         const Twine &name = ""); -  void EmitNoreturnRuntimeCallOrInvoke(llvm::Value *callee, -                                       ArrayRef<llvm::Value*> args); +  llvm::CallBase *EmitCallOrInvoke(llvm::FunctionCallee Callee, +                                   ArrayRef<llvm::Value *> Args, +                                   const Twine &Name = ""); +  llvm::CallBase *EmitRuntimeCallOrInvoke(llvm::FunctionCallee callee, +                                          ArrayRef<llvm::Value *> args, +                                          const Twine &name = ""); +  llvm::CallBase *EmitRuntimeCallOrInvoke(llvm::FunctionCallee callee, +                                          const Twine &name = ""); +  void EmitNoreturnRuntimeCallOrInvoke(llvm::FunctionCallee callee, +                                       ArrayRef<llvm::Value *> args);    CGCallee BuildAppleKextVirtualCall(const CXXMethodDecl *MD,                                       NestedNameSpecifier *Qual, @@ -3659,11 +3678,10 @@ public:                                llvm::Value *ImplicitParam,                                QualType ImplicitParamTy, const CallExpr *E,                                CallArgList *RtlArgs); -  RValue EmitCXXDestructorCall(const CXXDestructorDecl *DD, -                               const CGCallee &Callee, -                               llvm::Value *This, llvm::Value *ImplicitParam, -                               QualType ImplicitParamTy, const CallExpr *E, -                               StructorType Type); +  RValue EmitCXXDestructorCall(GlobalDecl Dtor, const CGCallee &Callee, +                               llvm::Value *This, QualType ThisTy, +                               llvm::Value *ImplicitParam, +                               QualType ImplicitParamTy, const CallExpr *E);    RValue EmitCXXMemberCallExpr(const CXXMemberCallExpr *E,                                 ReturnValueSlot ReturnValue);    RValue EmitCXXMemberOrOperatorMemberCallExpr(const CallExpr *CE, @@ -3727,9 +3745,6 @@ public:                                           Address PtrOp0, Address PtrOp1,                                           llvm::Triple::ArchType Arch); -  llvm::Value *EmitISOVolatileLoad(const CallExpr *E); -  llvm::Value *EmitISOVolatileStore(const CallExpr *E); -    llvm::Function *LookupNeonLLVMIntrinsic(unsigned IntrinsicID,                                            unsigned Modifier, llvm::Type *ArgTy,                                            const CallExpr *E); @@ -3825,6 +3840,8 @@ public:                               llvm::Type *returnType);    llvm::Value *EmitObjCAllocWithZone(llvm::Value *value,                                       llvm::Type *returnType); +  llvm::Value *EmitObjCAllocInit(llvm::Value *value, llvm::Type *resultType); +    llvm::Value *EmitObjCThrowOperand(const Expr *expr);    llvm::Value *EmitObjCConsumeObject(QualType T, llvm::Value *Ptr);    llvm::Value *EmitObjCExtendObjectLifetime(QualType T, llvm::Value *Ptr); @@ -3922,12 +3939,12 @@ public:    void EmitCXXGlobalVarDeclInit(const VarDecl &D, llvm::Constant *DeclPtr,                                  bool PerformInit); -  llvm::Constant *createAtExitStub(const VarDecl &VD, llvm::Constant *Dtor, +  llvm::Function *createAtExitStub(const VarDecl &VD, llvm::FunctionCallee Dtor,                                     llvm::Constant *Addr);    /// Call atexit() with a function that passes the given argument to    /// the given function. -  void registerGlobalDtorWithAtExit(const VarDecl &D, llvm::Constant *fn, +  void registerGlobalDtorWithAtExit(const VarDecl &D, llvm::FunctionCallee fn,                                      llvm::Constant *addr);    /// Call atexit() with function dtorStub. @@ -3960,8 +3977,8 @@ public:    /// variables.    void GenerateCXXGlobalDtorsFunc(        llvm::Function *Fn, -      const std::vector<std::pair<llvm::WeakTrackingVH, llvm::Constant *>> -          &DtorsAndObjects); +      const std::vector<std::tuple<llvm::FunctionType *, llvm::WeakTrackingVH, +                                   llvm::Constant *>> &DtorsAndObjects);    void GenerateCXXGlobalVarDeclInitFunc(llvm::Function *Fn,                                          const VarDecl *D, @@ -3982,16 +3999,14 @@ public:    void EmitCXXThrowExpr(const CXXThrowExpr *E, bool KeepInsertionPoint = true); -  void EmitLambdaExpr(const LambdaExpr *E, AggValueSlot Dest); -    RValue EmitAtomicExpr(AtomicExpr *E);    //===--------------------------------------------------------------------===//    //                         Annotations Emission    //===--------------------------------------------------------------------===// -  /// Emit an annotation call (intrinsic or builtin). -  llvm::Value *EmitAnnotationCall(llvm::Value *AnnotationFn, +  /// Emit an annotation call (intrinsic). +  llvm::Value *EmitAnnotationCall(llvm::Function *AnnotationFn,                                    llvm::Value *AnnotatedVal,                                    StringRef AnnotationStr,                                    SourceLocation Location); @@ -4084,8 +4099,8 @@ public:    /// passing to a runtime sanitizer handler.    llvm::Constant *EmitCheckSourceLocation(SourceLocation Loc); -  /// Create a basic block that will call a handler function in a -  /// sanitizer runtime with the provided arguments, and create a conditional +  /// Create a basic block that will either trap or call a handler function in +  /// the UBSan runtime with the provided arguments, and create a conditional    /// branch to it.    void EmitCheck(ArrayRef<std::pair<llvm::Value *, SanitizerMask>> Checked,                   SanitizerHandler Check, ArrayRef<llvm::Constant *> StaticArgs, @@ -4177,14 +4192,19 @@ private:    /// If EmittedExpr is non-null, this will use that instead of re-emitting E.    llvm::Value *evaluateOrEmitBuiltinObjectSize(const Expr *E, unsigned Type,                                                 llvm::IntegerType *ResType, -                                               llvm::Value *EmittedE); +                                               llvm::Value *EmittedE, +                                               bool IsDynamic);    /// Emits the size of E, as required by __builtin_object_size. This    /// function is aware of pass_object_size parameters, and will act accordingly    /// if E is a parameter with the pass_object_size attribute.    llvm::Value *emitBuiltinObjectSize(const Expr *E, unsigned Type,                                       llvm::IntegerType *ResType, -                                     llvm::Value *EmittedE); +                                     llvm::Value *EmittedE, +                                     bool IsDynamic); + +  void emitZeroOrPatternForAutoVarInit(QualType type, const VarDecl &D, +                                       Address Loc);  public:  #ifndef NDEBUG  | 
