Mercurial > hg > CbC > CbC_llvm
diff lib/Transforms/Instrumentation/ThreadSanitizer.cpp @ 33:e4204d083e25 LLVM3.5
LLVM 3.5
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 12 Dec 2013 14:32:10 +0900 |
parents | 95c75e76d11b |
children | 54457678186b |
line wrap: on
line diff
--- a/lib/Transforms/Instrumentation/ThreadSanitizer.cpp Thu Dec 12 13:57:29 2013 +0900 +++ b/lib/Transforms/Instrumentation/ThreadSanitizer.cpp Thu Dec 12 14:32:10 2013 +0900 @@ -402,8 +402,13 @@ if (IsWrite && isVtableAccess(I)) { DEBUG(dbgs() << " VPTR : " << *I << "\n"); Value *StoredValue = cast<StoreInst>(I)->getValueOperand(); - // StoredValue does not necessary have a pointer type. - if (isa<IntegerType>(StoredValue->getType())) + // StoredValue may be a vector type if we are storing several vptrs at once. + // In this case, just take the first element of the vector since this is + // enough to find vptr races. + if (isa<VectorType>(StoredValue->getType())) + StoredValue = IRB.CreateExtractElement( + StoredValue, ConstantInt::get(IRB.getInt32Ty(), 0)); + if (StoredValue->getType()->isIntegerTy()) StoredValue = IRB.CreateIntToPtr(StoredValue, IRB.getInt8PtrTy()); // Call TsanVptrUpdate. IRB.CreateCall2(TsanVptrUpdate,