diff options
Diffstat (limited to 'llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp | 221 | 
1 files changed, 119 insertions, 102 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp index 69c9020e060b..80acab307578 100644 --- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -170,12 +170,14 @@  #include "llvm/IR/Instructions.h"  #include "llvm/IR/IntrinsicInst.h"  #include "llvm/IR/Intrinsics.h" +#include "llvm/IR/IntrinsicsX86.h"  #include "llvm/IR/LLVMContext.h"  #include "llvm/IR/MDBuilder.h"  #include "llvm/IR/Module.h"  #include "llvm/IR/Type.h"  #include "llvm/IR/Value.h"  #include "llvm/IR/ValueMap.h" +#include "llvm/InitializePasses.h"  #include "llvm/Pass.h"  #include "llvm/Support/AtomicOrdering.h"  #include "llvm/Support/Casting.h" @@ -202,8 +204,8 @@ using namespace llvm;  #define DEBUG_TYPE "msan"  static const unsigned kOriginSize = 4; -static const unsigned kMinOriginAlignment = 4; -static const unsigned kShadowTLSAlignment = 8; +static const Align kMinOriginAlignment = Align(4); +static const Align kShadowTLSAlignment = Align(8);  // These constants must be kept in sync with the ones in msan.h.  static const unsigned kParamTLSSize = 800; @@ -1086,15 +1088,15 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {    /// Fill memory range with the given origin value.    void paintOrigin(IRBuilder<> &IRB, Value *Origin, Value *OriginPtr, -                   unsigned Size, unsigned Alignment) { +                   unsigned Size, Align Alignment) {      const DataLayout &DL = F.getParent()->getDataLayout(); -    unsigned IntptrAlignment = DL.getABITypeAlignment(MS.IntptrTy); +    const Align IntptrAlignment = Align(DL.getABITypeAlignment(MS.IntptrTy));      unsigned IntptrSize = DL.getTypeStoreSize(MS.IntptrTy);      assert(IntptrAlignment >= kMinOriginAlignment);      assert(IntptrSize >= kOriginSize);      unsigned Ofs = 0; -    unsigned CurrentAlignment = Alignment; +    Align CurrentAlignment = Alignment;      if (Alignment >= IntptrAlignment && IntptrSize > kOriginSize) {        Value *IntptrOrigin = originToIntptr(IRB, Origin);        Value *IntptrOriginPtr = @@ -1102,7 +1104,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {        for (unsigned i = 0; i < Size / IntptrSize; ++i) {          Value *Ptr = i ? IRB.CreateConstGEP1_32(MS.IntptrTy, IntptrOriginPtr, i)                         : IntptrOriginPtr; -        IRB.CreateAlignedStore(IntptrOrigin, Ptr, CurrentAlignment); +        IRB.CreateAlignedStore(IntptrOrigin, Ptr, CurrentAlignment.value());          Ofs += IntptrSize / kOriginSize;          CurrentAlignment = IntptrAlignment;        } @@ -1111,23 +1113,22 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {      for (unsigned i = Ofs; i < (Size + kOriginSize - 1) / kOriginSize; ++i) {        Value *GEP =            i ? IRB.CreateConstGEP1_32(MS.OriginTy, OriginPtr, i) : OriginPtr; -      IRB.CreateAlignedStore(Origin, GEP, CurrentAlignment); +      IRB.CreateAlignedStore(Origin, GEP, CurrentAlignment.value());        CurrentAlignment = kMinOriginAlignment;      }    }    void storeOrigin(IRBuilder<> &IRB, Value *Addr, Value *Shadow, Value *Origin, -                   Value *OriginPtr, unsigned Alignment, bool AsCall) { +                   Value *OriginPtr, Align Alignment, bool AsCall) {      const DataLayout &DL = F.getParent()->getDataLayout(); -    unsigned OriginAlignment = std::max(kMinOriginAlignment, Alignment); +    const Align OriginAlignment = std::max(kMinOriginAlignment, Alignment);      unsigned StoreSize = DL.getTypeStoreSize(Shadow->getType());      if (Shadow->getType()->isAggregateType()) {        paintOrigin(IRB, updateOrigin(Origin, IRB), OriginPtr, StoreSize,                    OriginAlignment);      } else {        Value *ConvertedShadow = convertToShadowTyNoVec(Shadow, IRB); -      Constant *ConstantShadow = dyn_cast_or_null<Constant>(ConvertedShadow); -      if (ConstantShadow) { +      if (auto *ConstantShadow = dyn_cast<Constant>(ConvertedShadow)) {          if (ClCheckConstantShadow && !ConstantShadow->isZeroValue())            paintOrigin(IRB, updateOrigin(Origin, IRB), OriginPtr, StoreSize,                        OriginAlignment); @@ -1164,12 +1165,13 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {        Value *Shadow = SI->isAtomic() ? getCleanShadow(Val) : getShadow(Val);        Value *ShadowPtr, *OriginPtr;        Type *ShadowTy = Shadow->getType(); -      unsigned Alignment = SI->getAlignment(); -      unsigned OriginAlignment = std::max(kMinOriginAlignment, Alignment); +      const Align Alignment = assumeAligned(SI->getAlignment()); +      const Align OriginAlignment = std::max(kMinOriginAlignment, Alignment);        std::tie(ShadowPtr, OriginPtr) =            getShadowOriginPtr(Addr, IRB, ShadowTy, Alignment, /*isStore*/ true); -      StoreInst *NewSI = IRB.CreateAlignedStore(Shadow, ShadowPtr, Alignment); +      StoreInst *NewSI = +          IRB.CreateAlignedStore(Shadow, ShadowPtr, Alignment.value());        LLVM_DEBUG(dbgs() << "  STORE: " << *NewSI << "\n");        (void)NewSI; @@ -1207,8 +1209,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {      Value *ConvertedShadow = convertToShadowTyNoVec(Shadow, IRB);      LLVM_DEBUG(dbgs() << "  SHAD1 : " << *ConvertedShadow << "\n"); -    Constant *ConstantShadow = dyn_cast_or_null<Constant>(ConvertedShadow); -    if (ConstantShadow) { +    if (auto *ConstantShadow = dyn_cast<Constant>(ConvertedShadow)) {        if (ClCheckConstantShadow && !ConstantShadow->isZeroValue()) {          insertWarningFn(IRB, Origin);        } @@ -1403,10 +1404,9 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {    ///    /// Shadow = ShadowBase + Offset    /// Origin = (OriginBase + Offset) & ~3ULL -  std::pair<Value *, Value *> getShadowOriginPtrUserspace(Value *Addr, -                                                          IRBuilder<> &IRB, -                                                          Type *ShadowTy, -                                                          unsigned Alignment) { +  std::pair<Value *, Value *> +  getShadowOriginPtrUserspace(Value *Addr, IRBuilder<> &IRB, Type *ShadowTy, +                              MaybeAlign Alignment) {      Value *ShadowOffset = getShadowPtrOffset(Addr, IRB);      Value *ShadowLong = ShadowOffset;      uint64_t ShadowBase = MS.MapParams->ShadowBase; @@ -1424,8 +1424,8 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {        if (OriginBase != 0)          OriginLong = IRB.CreateAdd(OriginLong,                                     ConstantInt::get(MS.IntptrTy, OriginBase)); -      if (Alignment < kMinOriginAlignment) { -        uint64_t Mask = kMinOriginAlignment - 1; +      if (!Alignment || *Alignment < kMinOriginAlignment) { +        uint64_t Mask = kMinOriginAlignment.value() - 1;          OriginLong =              IRB.CreateAnd(OriginLong, ConstantInt::get(MS.IntptrTy, ~Mask));        } @@ -1435,9 +1435,10 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {      return std::make_pair(ShadowPtr, OriginPtr);    } -  std::pair<Value *, Value *> -  getShadowOriginPtrKernel(Value *Addr, IRBuilder<> &IRB, Type *ShadowTy, -                           unsigned Alignment, bool isStore) { +  std::pair<Value *, Value *> getShadowOriginPtrKernel(Value *Addr, +                                                       IRBuilder<> &IRB, +                                                       Type *ShadowTy, +                                                       bool isStore) {      Value *ShadowOriginPtrs;      const DataLayout &DL = F.getParent()->getDataLayout();      int Size = DL.getTypeStoreSize(ShadowTy); @@ -1462,14 +1463,11 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {    std::pair<Value *, Value *> getShadowOriginPtr(Value *Addr, IRBuilder<> &IRB,                                                   Type *ShadowTy, -                                                 unsigned Alignment, +                                                 MaybeAlign Alignment,                                                   bool isStore) { -    std::pair<Value *, Value *> ret;      if (MS.CompileKernel) -      ret = getShadowOriginPtrKernel(Addr, IRB, ShadowTy, Alignment, isStore); -    else -      ret = getShadowOriginPtrUserspace(Addr, IRB, ShadowTy, Alignment); -    return ret; +      return getShadowOriginPtrKernel(Addr, IRB, ShadowTy, isStore); +    return getShadowOriginPtrUserspace(Addr, IRB, ShadowTy, Alignment);    }    /// Compute the shadow address for a given function argument. @@ -1619,11 +1617,9 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {              // ByVal pointer itself has clean shadow. We copy the actual              // argument shadow to the underlying memory.              // Figure out maximal valid memcpy alignment. -            unsigned ArgAlign = FArg.getParamAlignment(); -            if (ArgAlign == 0) { -              Type *EltType = A->getType()->getPointerElementType(); -              ArgAlign = DL.getABITypeAlignment(EltType); -            } +            const Align ArgAlign = DL.getValueOrABITypeAlignment( +                MaybeAlign(FArg.getParamAlignment()), +                A->getType()->getPointerElementType());              Value *CpShadowPtr =                  getShadowOriginPtr(V, EntryIRB, EntryIRB.getInt8Ty(), ArgAlign,                                     /*isStore*/ true) @@ -1635,7 +1631,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {                    CpShadowPtr, Constant::getNullValue(EntryIRB.getInt8Ty()),                    Size, ArgAlign);              } else { -              unsigned CopyAlign = std::min(ArgAlign, kShadowTLSAlignment); +              const Align CopyAlign = std::min(ArgAlign, kShadowTLSAlignment);                Value *Cpy = EntryIRB.CreateMemCpy(CpShadowPtr, CopyAlign, Base,                                                   CopyAlign, Size);                LLVM_DEBUG(dbgs() << "  ByValCpy: " << *Cpy << "\n"); @@ -1647,8 +1643,8 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {                // ParamTLS overflow.                *ShadowPtr = getCleanShadow(V);              } else { -              *ShadowPtr = EntryIRB.CreateAlignedLoad(getShadowTy(&FArg), Base, -                                                      kShadowTLSAlignment); +              *ShadowPtr = EntryIRB.CreateAlignedLoad( +                  getShadowTy(&FArg), Base, kShadowTLSAlignment.value());              }            }            LLVM_DEBUG(dbgs() @@ -1782,13 +1778,13 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {      IRBuilder<> IRB(I.getNextNode());      Type *ShadowTy = getShadowTy(&I);      Value *Addr = I.getPointerOperand(); -    Value *ShadowPtr, *OriginPtr; -    unsigned Alignment = I.getAlignment(); +    Value *ShadowPtr = nullptr, *OriginPtr = nullptr; +    const Align Alignment = assumeAligned(I.getAlignment());      if (PropagateShadow) {        std::tie(ShadowPtr, OriginPtr) =            getShadowOriginPtr(Addr, IRB, ShadowTy, Alignment, /*isStore*/ false); -      setShadow(&I, -                IRB.CreateAlignedLoad(ShadowTy, ShadowPtr, Alignment, "_msld")); +      setShadow(&I, IRB.CreateAlignedLoad(ShadowTy, ShadowPtr, +                                          Alignment.value(), "_msld"));      } else {        setShadow(&I, getCleanShadow(&I));      } @@ -1801,9 +1797,9 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {      if (MS.TrackOrigins) {        if (PropagateShadow) { -        unsigned OriginAlignment = std::max(kMinOriginAlignment, Alignment); -        setOrigin( -            &I, IRB.CreateAlignedLoad(MS.OriginTy, OriginPtr, OriginAlignment)); +        const Align OriginAlignment = std::max(kMinOriginAlignment, Alignment); +        setOrigin(&I, IRB.CreateAlignedLoad(MS.OriginTy, OriginPtr, +                                            OriginAlignment.value()));        } else {          setOrigin(&I, getCleanOrigin());        } @@ -1825,8 +1821,8 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {      IRBuilder<> IRB(&I);      Value *Addr = I.getOperand(0); -    Value *ShadowPtr = getShadowOriginPtr(Addr, IRB, I.getType(), -                                          /*Alignment*/ 1, /*isStore*/ true) +    Value *ShadowPtr = getShadowOriginPtr(Addr, IRB, I.getType(), Align::None(), +                                          /*isStore*/ true)                             .first;      if (ClCheckAccessAddress) @@ -2458,7 +2454,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {      // We don't know the pointer alignment (could be unaligned SSE store!).      // Have to assume to worst case.      std::tie(ShadowPtr, OriginPtr) = getShadowOriginPtr( -        Addr, IRB, Shadow->getType(), /*Alignment*/ 1, /*isStore*/ true); +        Addr, IRB, Shadow->getType(), Align::None(), /*isStore*/ true);      IRB.CreateAlignedStore(Shadow, ShadowPtr, 1);      if (ClCheckAccessAddress) @@ -2478,15 +2474,15 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {      Value *Addr = I.getArgOperand(0);      Type *ShadowTy = getShadowTy(&I); -    Value *ShadowPtr, *OriginPtr; +    Value *ShadowPtr = nullptr, *OriginPtr = nullptr;      if (PropagateShadow) {        // We don't know the pointer alignment (could be unaligned SSE load!).        // Have to assume to worst case. -      unsigned Alignment = 1; +      const Align Alignment = Align::None();        std::tie(ShadowPtr, OriginPtr) =            getShadowOriginPtr(Addr, IRB, ShadowTy, Alignment, /*isStore*/ false); -      setShadow(&I, -                IRB.CreateAlignedLoad(ShadowTy, ShadowPtr, Alignment, "_msld")); +      setShadow(&I, IRB.CreateAlignedLoad(ShadowTy, ShadowPtr, +                                          Alignment.value(), "_msld"));      } else {        setShadow(&I, getCleanShadow(&I));      } @@ -2873,7 +2869,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {      Value* Addr = I.getArgOperand(0);      Type *Ty = IRB.getInt32Ty();      Value *ShadowPtr = -        getShadowOriginPtr(Addr, IRB, Ty, /*Alignment*/ 1, /*isStore*/ true) +        getShadowOriginPtr(Addr, IRB, Ty, Align::None(), /*isStore*/ true)              .first;      IRB.CreateStore(getCleanShadow(Ty), @@ -2889,7 +2885,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {      IRBuilder<> IRB(&I);      Value *Addr = I.getArgOperand(0);      Type *Ty = IRB.getInt32Ty(); -    unsigned Alignment = 1; +    const Align Alignment = Align::None();      Value *ShadowPtr, *OriginPtr;      std::tie(ShadowPtr, OriginPtr) =          getShadowOriginPtr(Addr, IRB, Ty, Alignment, /*isStore*/ false); @@ -2897,7 +2893,8 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {      if (ClCheckAccessAddress)        insertShadowCheck(Addr, &I); -    Value *Shadow = IRB.CreateAlignedLoad(Ty, ShadowPtr, Alignment, "_ldmxcsr"); +    Value *Shadow = +        IRB.CreateAlignedLoad(Ty, ShadowPtr, Alignment.value(), "_ldmxcsr");      Value *Origin = MS.TrackOrigins ? IRB.CreateLoad(MS.OriginTy, OriginPtr)                                      : getCleanOrigin();      insertShadowCheck(Shadow, Origin, &I); @@ -2907,14 +2904,15 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {      IRBuilder<> IRB(&I);      Value *V = I.getArgOperand(0);      Value *Addr = I.getArgOperand(1); -    unsigned Align = cast<ConstantInt>(I.getArgOperand(2))->getZExtValue(); +    const MaybeAlign Alignment( +        cast<ConstantInt>(I.getArgOperand(2))->getZExtValue());      Value *Mask = I.getArgOperand(3);      Value *Shadow = getShadow(V);      Value *ShadowPtr;      Value *OriginPtr;      std::tie(ShadowPtr, OriginPtr) = getShadowOriginPtr( -        Addr, IRB, Shadow->getType(), Align, /*isStore*/ true); +        Addr, IRB, Shadow->getType(), Alignment, /*isStore*/ true);      if (ClCheckAccessAddress) {        insertShadowCheck(Addr, &I); @@ -2923,20 +2921,22 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {        insertShadowCheck(Mask, &I);      } -    IRB.CreateMaskedStore(Shadow, ShadowPtr, Align, Mask); +    IRB.CreateMaskedStore(Shadow, ShadowPtr, Alignment ? Alignment->value() : 0, +                          Mask);      if (MS.TrackOrigins) {        auto &DL = F.getParent()->getDataLayout();        paintOrigin(IRB, getOrigin(V), OriginPtr,                    DL.getTypeStoreSize(Shadow->getType()), -                  std::max(Align, kMinOriginAlignment)); +                  llvm::max(Alignment, kMinOriginAlignment));      }    }    bool handleMaskedLoad(IntrinsicInst &I) {      IRBuilder<> IRB(&I);      Value *Addr = I.getArgOperand(0); -    unsigned Align = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue(); +    const MaybeAlign Alignment( +        cast<ConstantInt>(I.getArgOperand(1))->getZExtValue());      Value *Mask = I.getArgOperand(2);      Value *PassThru = I.getArgOperand(3); @@ -2944,9 +2944,10 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {      Value *ShadowPtr, *OriginPtr;      if (PropagateShadow) {        std::tie(ShadowPtr, OriginPtr) = -          getShadowOriginPtr(Addr, IRB, ShadowTy, Align, /*isStore*/ false); -      setShadow(&I, IRB.CreateMaskedLoad(ShadowPtr, Align, Mask, -                                         getShadow(PassThru), "_msmaskedld")); +          getShadowOriginPtr(Addr, IRB, ShadowTy, Alignment, /*isStore*/ false); +      setShadow(&I, IRB.CreateMaskedLoad( +                        ShadowPtr, Alignment ? Alignment->value() : 0, Mask, +                        getShadow(PassThru), "_msmaskedld"));      } else {        setShadow(&I, getCleanShadow(&I));      } @@ -3278,7 +3279,10 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {          // Clear out readonly/readnone attributes.          AttrBuilder B;          B.addAttribute(Attribute::ReadOnly) -          .addAttribute(Attribute::ReadNone); +            .addAttribute(Attribute::ReadNone) +            .addAttribute(Attribute::WriteOnly) +            .addAttribute(Attribute::ArgMemOnly) +            .addAttribute(Attribute::Speculatable);          Func->removeAttributes(AttributeList::FunctionIndex, B);        } @@ -3312,8 +3316,10 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {                 "ByVal argument is not a pointer!");          Size = DL.getTypeAllocSize(A->getType()->getPointerElementType());          if (ArgOffset + Size > kParamTLSSize) break; -        unsigned ParamAlignment = CS.getParamAlignment(i); -        unsigned Alignment = std::min(ParamAlignment, kShadowTLSAlignment); +        const MaybeAlign ParamAlignment(CS.getParamAlignment(i)); +        MaybeAlign Alignment = llvm::None; +        if (ParamAlignment) +          Alignment = std::min(*ParamAlignment, kShadowTLSAlignment);          Value *AShadowPtr =              getShadowOriginPtr(A, IRB, IRB.getInt8Ty(), Alignment,                                 /*isStore*/ false) @@ -3326,7 +3332,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {          Size = DL.getTypeAllocSize(A->getType());          if (ArgOffset + Size > kParamTLSSize) break;          Store = IRB.CreateAlignedStore(ArgShadow, ArgShadowBase, -                                       kShadowTLSAlignment); +                                       kShadowTLSAlignment.value());          Constant *Cst = dyn_cast<Constant>(ArgShadow);          if (Cst && Cst->isNullValue()) ArgIsInitialized = true;        } @@ -3352,7 +3358,8 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {      IRBuilder<> IRBBefore(&I);      // Until we have full dynamic coverage, make sure the retval shadow is 0.      Value *Base = getShadowPtrForRetval(&I, IRBBefore); -    IRBBefore.CreateAlignedStore(getCleanShadow(&I), Base, kShadowTLSAlignment); +    IRBBefore.CreateAlignedStore(getCleanShadow(&I), Base, +                                 kShadowTLSAlignment.value());      BasicBlock::iterator NextInsn;      if (CS.isCall()) {        NextInsn = ++I.getIterator(); @@ -3376,7 +3383,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {      IRBuilder<> IRBAfter(&*NextInsn);      Value *RetvalShadow = IRBAfter.CreateAlignedLoad(          getShadowTy(&I), getShadowPtrForRetval(&I, IRBAfter), -        kShadowTLSAlignment, "_msret"); +        kShadowTLSAlignment.value(), "_msret");      setShadow(&I, RetvalShadow);      if (MS.TrackOrigins)        setOrigin(&I, IRBAfter.CreateLoad(MS.OriginTy, @@ -3403,10 +3410,10 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {      if (CheckReturnValue) {        insertShadowCheck(RetVal, &I);        Value *Shadow = getCleanShadow(RetVal); -      IRB.CreateAlignedStore(Shadow, ShadowPtr, kShadowTLSAlignment); +      IRB.CreateAlignedStore(Shadow, ShadowPtr, kShadowTLSAlignment.value());      } else {        Value *Shadow = getShadow(RetVal); -      IRB.CreateAlignedStore(Shadow, ShadowPtr, kShadowTLSAlignment); +      IRB.CreateAlignedStore(Shadow, ShadowPtr, kShadowTLSAlignment.value());        if (MS.TrackOrigins)          IRB.CreateStore(getOrigin(RetVal), getOriginPtrForRetval(IRB));      } @@ -3447,11 +3454,12 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {                       {IRB.CreatePointerCast(&I, IRB.getInt8PtrTy()), Len});      } else {        Value *ShadowBase, *OriginBase; -      std::tie(ShadowBase, OriginBase) = -          getShadowOriginPtr(&I, IRB, IRB.getInt8Ty(), 1, /*isStore*/ true); +      std::tie(ShadowBase, OriginBase) = getShadowOriginPtr( +          &I, IRB, IRB.getInt8Ty(), Align::None(), /*isStore*/ true);        Value *PoisonValue = IRB.getInt8(PoisonStack ? ClPoisonStackPattern : 0); -      IRB.CreateMemSet(ShadowBase, PoisonValue, Len, I.getAlignment()); +      IRB.CreateMemSet(ShadowBase, PoisonValue, Len, +                       MaybeAlign(I.getAlignment()));      }      if (PoisonStack && MS.TrackOrigins) { @@ -3863,7 +3871,7 @@ struct VarArgAMD64Helper : public VarArgHelper {          if (!ShadowBase)            continue;          Value *Shadow = MSV.getShadow(A); -        IRB.CreateAlignedStore(Shadow, ShadowBase, kShadowTLSAlignment); +        IRB.CreateAlignedStore(Shadow, ShadowBase, kShadowTLSAlignment.value());          if (MS.TrackOrigins) {            Value *Origin = MSV.getOrigin(A);            unsigned StoreSize = DL.getTypeStoreSize(Shadow->getType()); @@ -3904,7 +3912,7 @@ struct VarArgAMD64Helper : public VarArgHelper {      IRBuilder<> IRB(&I);      Value *VAListTag = I.getArgOperand(0);      Value *ShadowPtr, *OriginPtr; -    unsigned Alignment = 8; +    const Align Alignment = Align(8);      std::tie(ShadowPtr, OriginPtr) =          MSV.getShadowOriginPtr(VAListTag, IRB, IRB.getInt8Ty(), Alignment,                                 /*isStore*/ true); @@ -3942,10 +3950,11 @@ struct VarArgAMD64Helper : public VarArgHelper {          IRB.CreateAdd(ConstantInt::get(MS.IntptrTy, AMD64FpEndOffset),                        VAArgOverflowSize);        VAArgTLSCopy = IRB.CreateAlloca(Type::getInt8Ty(*MS.C), CopySize); -      IRB.CreateMemCpy(VAArgTLSCopy, 8, MS.VAArgTLS, 8, CopySize); +      IRB.CreateMemCpy(VAArgTLSCopy, Align(8), MS.VAArgTLS, Align(8), CopySize);        if (MS.TrackOrigins) {          VAArgTLSOriginCopy = IRB.CreateAlloca(Type::getInt8Ty(*MS.C), CopySize); -        IRB.CreateMemCpy(VAArgTLSOriginCopy, 8, MS.VAArgOriginTLS, 8, CopySize); +        IRB.CreateMemCpy(VAArgTLSOriginCopy, Align(8), MS.VAArgOriginTLS, +                         Align(8), CopySize);        }      } @@ -3964,7 +3973,7 @@ struct VarArgAMD64Helper : public VarArgHelper {        Value *RegSaveAreaPtr =            IRB.CreateLoad(RegSaveAreaPtrTy, RegSaveAreaPtrPtr);        Value *RegSaveAreaShadowPtr, *RegSaveAreaOriginPtr; -      unsigned Alignment = 16; +      const Align Alignment = Align(16);        std::tie(RegSaveAreaShadowPtr, RegSaveAreaOriginPtr) =            MSV.getShadowOriginPtr(RegSaveAreaPtr, IRB, IRB.getInt8Ty(),                                   Alignment, /*isStore*/ true); @@ -4032,7 +4041,8 @@ struct VarArgMIPS64Helper : public VarArgHelper {        VAArgOffset = alignTo(VAArgOffset, 8);        if (!Base)          continue; -      IRB.CreateAlignedStore(MSV.getShadow(A), Base, kShadowTLSAlignment); +      IRB.CreateAlignedStore(MSV.getShadow(A), Base, +                             kShadowTLSAlignment.value());      }      Constant *TotalVAArgSize = ConstantInt::get(IRB.getInt64Ty(), VAArgOffset); @@ -4058,7 +4068,7 @@ struct VarArgMIPS64Helper : public VarArgHelper {      VAStartInstrumentationList.push_back(&I);      Value *VAListTag = I.getArgOperand(0);      Value *ShadowPtr, *OriginPtr; -    unsigned Alignment = 8; +    const Align Alignment = Align(8);      std::tie(ShadowPtr, OriginPtr) = MSV.getShadowOriginPtr(          VAListTag, IRB, IRB.getInt8Ty(), Alignment, /*isStore*/ true);      IRB.CreateMemSet(ShadowPtr, Constant::getNullValue(IRB.getInt8Ty()), @@ -4070,7 +4080,7 @@ struct VarArgMIPS64Helper : public VarArgHelper {      VAStartInstrumentationList.push_back(&I);      Value *VAListTag = I.getArgOperand(0);      Value *ShadowPtr, *OriginPtr; -    unsigned Alignment = 8; +    const Align Alignment = Align(8);      std::tie(ShadowPtr, OriginPtr) = MSV.getShadowOriginPtr(          VAListTag, IRB, IRB.getInt8Ty(), Alignment, /*isStore*/ true);      IRB.CreateMemSet(ShadowPtr, Constant::getNullValue(IRB.getInt8Ty()), @@ -4089,7 +4099,7 @@ struct VarArgMIPS64Helper : public VarArgHelper {        // If there is a va_start in this function, make a backup copy of        // va_arg_tls somewhere in the function entry block.        VAArgTLSCopy = IRB.CreateAlloca(Type::getInt8Ty(*MS.C), CopySize); -      IRB.CreateMemCpy(VAArgTLSCopy, 8, MS.VAArgTLS, 8, CopySize); +      IRB.CreateMemCpy(VAArgTLSCopy, Align(8), MS.VAArgTLS, Align(8), CopySize);      }      // Instrument va_start. @@ -4105,7 +4115,7 @@ struct VarArgMIPS64Helper : public VarArgHelper {        Value *RegSaveAreaPtr =            IRB.CreateLoad(RegSaveAreaPtrTy, RegSaveAreaPtrPtr);        Value *RegSaveAreaShadowPtr, *RegSaveAreaOriginPtr; -      unsigned Alignment = 8; +      const Align Alignment = Align(8);        std::tie(RegSaveAreaShadowPtr, RegSaveAreaOriginPtr) =            MSV.getShadowOriginPtr(RegSaveAreaPtr, IRB, IRB.getInt8Ty(),                                   Alignment, /*isStore*/ true); @@ -4203,7 +4213,8 @@ struct VarArgAArch64Helper : public VarArgHelper {          continue;        if (!Base)          continue; -      IRB.CreateAlignedStore(MSV.getShadow(A), Base, kShadowTLSAlignment); +      IRB.CreateAlignedStore(MSV.getShadow(A), Base, +                             kShadowTLSAlignment.value());      }      Constant *OverflowSize =        ConstantInt::get(IRB.getInt64Ty(), OverflowOffset - AArch64VAEndOffset); @@ -4227,7 +4238,7 @@ struct VarArgAArch64Helper : public VarArgHelper {      VAStartInstrumentationList.push_back(&I);      Value *VAListTag = I.getArgOperand(0);      Value *ShadowPtr, *OriginPtr; -    unsigned Alignment = 8; +    const Align Alignment = Align(8);      std::tie(ShadowPtr, OriginPtr) = MSV.getShadowOriginPtr(          VAListTag, IRB, IRB.getInt8Ty(), Alignment, /*isStore*/ true);      IRB.CreateMemSet(ShadowPtr, Constant::getNullValue(IRB.getInt8Ty()), @@ -4239,7 +4250,7 @@ struct VarArgAArch64Helper : public VarArgHelper {      VAStartInstrumentationList.push_back(&I);      Value *VAListTag = I.getArgOperand(0);      Value *ShadowPtr, *OriginPtr; -    unsigned Alignment = 8; +    const Align Alignment = Align(8);      std::tie(ShadowPtr, OriginPtr) = MSV.getShadowOriginPtr(          VAListTag, IRB, IRB.getInt8Ty(), Alignment, /*isStore*/ true);      IRB.CreateMemSet(ShadowPtr, Constant::getNullValue(IRB.getInt8Ty()), @@ -4280,7 +4291,7 @@ struct VarArgAArch64Helper : public VarArgHelper {          IRB.CreateAdd(ConstantInt::get(MS.IntptrTy, AArch64VAEndOffset),                        VAArgOverflowSize);        VAArgTLSCopy = IRB.CreateAlloca(Type::getInt8Ty(*MS.C), CopySize); -      IRB.CreateMemCpy(VAArgTLSCopy, 8, MS.VAArgTLS, 8, CopySize); +      IRB.CreateMemCpy(VAArgTLSCopy, Align(8), MS.VAArgTLS, Align(8), CopySize);      }      Value *GrArgSize = ConstantInt::get(MS.IntptrTy, kAArch64GrArgSize); @@ -4331,14 +4342,15 @@ struct VarArgAArch64Helper : public VarArgHelper {        Value *GrRegSaveAreaShadowPtr =            MSV.getShadowOriginPtr(GrRegSaveAreaPtr, IRB, IRB.getInt8Ty(), -                                 /*Alignment*/ 8, /*isStore*/ true) +                                 Align(8), /*isStore*/ true)                .first;        Value *GrSrcPtr = IRB.CreateInBoundsGEP(IRB.getInt8Ty(), VAArgTLSCopy,                                                GrRegSaveAreaShadowPtrOff);        Value *GrCopySize = IRB.CreateSub(GrArgSize, GrRegSaveAreaShadowPtrOff); -      IRB.CreateMemCpy(GrRegSaveAreaShadowPtr, 8, GrSrcPtr, 8, GrCopySize); +      IRB.CreateMemCpy(GrRegSaveAreaShadowPtr, Align(8), GrSrcPtr, Align(8), +                       GrCopySize);        // Again, but for FP/SIMD values.        Value *VrRegSaveAreaShadowPtrOff = @@ -4346,7 +4358,7 @@ struct VarArgAArch64Helper : public VarArgHelper {        Value *VrRegSaveAreaShadowPtr =            MSV.getShadowOriginPtr(VrRegSaveAreaPtr, IRB, IRB.getInt8Ty(), -                                 /*Alignment*/ 8, /*isStore*/ true) +                                 Align(8), /*isStore*/ true)                .first;        Value *VrSrcPtr = IRB.CreateInBoundsGEP( @@ -4356,20 +4368,21 @@ struct VarArgAArch64Helper : public VarArgHelper {          VrRegSaveAreaShadowPtrOff);        Value *VrCopySize = IRB.CreateSub(VrArgSize, VrRegSaveAreaShadowPtrOff); -      IRB.CreateMemCpy(VrRegSaveAreaShadowPtr, 8, VrSrcPtr, 8, VrCopySize); +      IRB.CreateMemCpy(VrRegSaveAreaShadowPtr, Align(8), VrSrcPtr, Align(8), +                       VrCopySize);        // And finally for remaining arguments.        Value *StackSaveAreaShadowPtr =            MSV.getShadowOriginPtr(StackSaveAreaPtr, IRB, IRB.getInt8Ty(), -                                 /*Alignment*/ 16, /*isStore*/ true) +                                 Align(16), /*isStore*/ true)                .first;        Value *StackSrcPtr =          IRB.CreateInBoundsGEP(IRB.getInt8Ty(), VAArgTLSCopy,                                IRB.getInt32(AArch64VAEndOffset)); -      IRB.CreateMemCpy(StackSaveAreaShadowPtr, 16, StackSrcPtr, 16, -                       VAArgOverflowSize); +      IRB.CreateMemCpy(StackSaveAreaShadowPtr, Align(16), StackSrcPtr, +                       Align(16), VAArgOverflowSize);      }    }  }; @@ -4461,7 +4474,8 @@ struct VarArgPowerPC64Helper : public VarArgHelper {            Base = getShadowPtrForVAArgument(A->getType(), IRB,                                             VAArgOffset - VAArgBase, ArgSize);            if (Base) -            IRB.CreateAlignedStore(MSV.getShadow(A), Base, kShadowTLSAlignment); +            IRB.CreateAlignedStore(MSV.getShadow(A), Base, +                                   kShadowTLSAlignment.value());          }          VAArgOffset += ArgSize;          VAArgOffset = alignTo(VAArgOffset, 8); @@ -4494,7 +4508,7 @@ struct VarArgPowerPC64Helper : public VarArgHelper {      VAStartInstrumentationList.push_back(&I);      Value *VAListTag = I.getArgOperand(0);      Value *ShadowPtr, *OriginPtr; -    unsigned Alignment = 8; +    const Align Alignment = Align(8);      std::tie(ShadowPtr, OriginPtr) = MSV.getShadowOriginPtr(          VAListTag, IRB, IRB.getInt8Ty(), Alignment, /*isStore*/ true);      IRB.CreateMemSet(ShadowPtr, Constant::getNullValue(IRB.getInt8Ty()), @@ -4505,7 +4519,7 @@ struct VarArgPowerPC64Helper : public VarArgHelper {      IRBuilder<> IRB(&I);      Value *VAListTag = I.getArgOperand(0);      Value *ShadowPtr, *OriginPtr; -    unsigned Alignment = 8; +    const Align Alignment = Align(8);      std::tie(ShadowPtr, OriginPtr) = MSV.getShadowOriginPtr(          VAListTag, IRB, IRB.getInt8Ty(), Alignment, /*isStore*/ true);      // Unpoison the whole __va_list_tag. @@ -4526,7 +4540,7 @@ struct VarArgPowerPC64Helper : public VarArgHelper {        // If there is a va_start in this function, make a backup copy of        // va_arg_tls somewhere in the function entry block.        VAArgTLSCopy = IRB.CreateAlloca(Type::getInt8Ty(*MS.C), CopySize); -      IRB.CreateMemCpy(VAArgTLSCopy, 8, MS.VAArgTLS, 8, CopySize); +      IRB.CreateMemCpy(VAArgTLSCopy, Align(8), MS.VAArgTLS, Align(8), CopySize);      }      // Instrument va_start. @@ -4542,7 +4556,7 @@ struct VarArgPowerPC64Helper : public VarArgHelper {        Value *RegSaveAreaPtr =            IRB.CreateLoad(RegSaveAreaPtrTy, RegSaveAreaPtrPtr);        Value *RegSaveAreaShadowPtr, *RegSaveAreaOriginPtr; -      unsigned Alignment = 8; +      const Align Alignment = Align(8);        std::tie(RegSaveAreaShadowPtr, RegSaveAreaOriginPtr) =            MSV.getShadowOriginPtr(RegSaveAreaPtr, IRB, IRB.getInt8Ty(),                                   Alignment, /*isStore*/ true); @@ -4595,7 +4609,10 @@ bool MemorySanitizer::sanitizeFunction(Function &F, TargetLibraryInfo &TLI) {    // Clear out readonly/readnone attributes.    AttrBuilder B;    B.addAttribute(Attribute::ReadOnly) -    .addAttribute(Attribute::ReadNone); +      .addAttribute(Attribute::ReadNone) +      .addAttribute(Attribute::WriteOnly) +      .addAttribute(Attribute::ArgMemOnly) +      .addAttribute(Attribute::Speculatable);    F.removeAttributes(AttributeList::FunctionIndex, B);    return Visitor.runOnFunction();  | 
