diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/CodeGen/CodeGenFunction.cpp')
| -rw-r--r-- | contrib/llvm-project/clang/lib/CodeGen/CodeGenFunction.cpp | 46 | 
1 files changed, 29 insertions, 17 deletions
| diff --git a/contrib/llvm-project/clang/lib/CodeGen/CodeGenFunction.cpp b/contrib/llvm-project/clang/lib/CodeGen/CodeGenFunction.cpp index e6adec6948af..50e1638924d1 100644 --- a/contrib/llvm-project/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/contrib/llvm-project/clang/lib/CodeGen/CodeGenFunction.cpp @@ -740,7 +740,7 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,  #include "clang/Basic/Sanitizers.def"  #undef SANITIZER -  } while (0); +  } while (false);    if (D) {      bool NoSanitizeCoverage = false; @@ -882,6 +882,13 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,      if (Offset)        Fn->addFnAttr("patchable-function-prefix", std::to_string(Offset));    } +  // Instruct that functions for COFF/CodeView targets should start with a +  // patchable instruction, but only on x86/x64. Don't forward this to ARM/ARM64 +  // backends as they don't need it -- instructions on these architectures are +  // always atomically patchable at runtime. +  if (CGM.getCodeGenOpts().HotPatch && +      getContext().getTargetInfo().getTriple().isX86()) +    Fn->addFnAttr("patchable-function", "prologue-short-redirect");    // Add no-jump-tables value.    if (CGM.getCodeGenOpts().NoUseJumpTables) @@ -1595,9 +1602,9 @@ void CodeGenFunction::EmitBranchToCounterBlock(    if (!InstrumentRegions || !isInstrumentedCondition(Cond))      return EmitBranchOnBoolExpr(Cond, TrueBlock, FalseBlock, TrueCount, LH); -  llvm::BasicBlock *ThenBlock = NULL; -  llvm::BasicBlock *ElseBlock = NULL; -  llvm::BasicBlock *NextBlock = NULL; +  llvm::BasicBlock *ThenBlock = nullptr; +  llvm::BasicBlock *ElseBlock = nullptr; +  llvm::BasicBlock *NextBlock = nullptr;    // Create the block we'll use to increment the appropriate counter.    llvm::BasicBlock *CounterIncrBlock = createBasicBlock("lop.rhscnt"); @@ -2109,6 +2116,7 @@ llvm::Value *CodeGenFunction::emitArrayLength(const ArrayType *origArrayType,      // Create the actual GEP.      addr = Address(Builder.CreateInBoundsGEP(          addr.getElementType(), addr.getPointer(), gepIndices, "array.begin"), +        ConvertTypeForMem(eltType),          addr.getAlignment());    } @@ -2246,32 +2254,36 @@ void CodeGenFunction::EmitVariablyModifiedType(QualType type) {        // Unknown size indication requires no size computation.        // Otherwise, evaluate and record it. -      if (const Expr *size = vat->getSizeExpr()) { +      if (const Expr *sizeExpr = vat->getSizeExpr()) {          // It's possible that we might have emitted this already,          // e.g. with a typedef and a pointer to it. -        llvm::Value *&entry = VLASizeMap[size]; +        llvm::Value *&entry = VLASizeMap[sizeExpr];          if (!entry) { -          llvm::Value *Size = EmitScalarExpr(size); +          llvm::Value *size = EmitScalarExpr(sizeExpr);            // C11 6.7.6.2p5:            //   If the size is an expression that is not an integer constant            //   expression [...] each time it is evaluated it shall have a value            //   greater than zero. -          if (SanOpts.has(SanitizerKind::VLABound) && -              size->getType()->isSignedIntegerType()) { +          if (SanOpts.has(SanitizerKind::VLABound)) {              SanitizerScope SanScope(this); -            llvm::Value *Zero = llvm::Constant::getNullValue(Size->getType()); +            llvm::Value *Zero = llvm::Constant::getNullValue(size->getType()); +            clang::QualType SEType = sizeExpr->getType(); +            llvm::Value *CheckCondition = +                SEType->isSignedIntegerType() +                    ? Builder.CreateICmpSGT(size, Zero) +                    : Builder.CreateICmpUGT(size, Zero);              llvm::Constant *StaticArgs[] = { -                EmitCheckSourceLocation(size->getBeginLoc()), -                EmitCheckTypeDescriptor(size->getType())}; -            EmitCheck(std::make_pair(Builder.CreateICmpSGT(Size, Zero), -                                     SanitizerKind::VLABound), -                      SanitizerHandler::VLABoundNotPositive, StaticArgs, Size); +                EmitCheckSourceLocation(sizeExpr->getBeginLoc()), +                EmitCheckTypeDescriptor(SEType)}; +            EmitCheck(std::make_pair(CheckCondition, SanitizerKind::VLABound), +                      SanitizerHandler::VLABoundNotPositive, StaticArgs, size);            }            // Always zexting here would be wrong if it weren't            // undefined behavior to have a negative bound. -          entry = Builder.CreateIntCast(Size, SizeTy, /*signed*/ false); +          // FIXME: What about when size's type is larger than size_t? +          entry = Builder.CreateIntCast(size, SizeTy, /*signed*/ false);          }        }        type = vat->getElementType(); @@ -2694,7 +2706,7 @@ void CodeGenFunction::emitAlignmentAssumptionCheck(      SanitizerScope SanScope(this);      if (!OffsetValue) -      OffsetValue = Builder.getInt1(0); // no offset. +      OffsetValue = Builder.getInt1(false); // no offset.      llvm::Constant *StaticData[] = {EmitCheckSourceLocation(Loc),                                      EmitCheckSourceLocation(SecondaryLoc), | 
