X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=CDSPass.cpp;h=108d4deadd54bceb020085519ea88db0f9ed4a2f;hb=69766a32e8dfde732b4d0194c23a15da398f1969;hp=6ec6dd2aac73a40aa28ec491a6a06004dfc112a3;hpb=dbca9deee4a28c78ba855fddc3c0d1250e3475b2;p=c11llvm.git diff --git a/CDSPass.cpp b/CDSPass.cpp index 6ec6dd2..108d4de 100644 --- a/CDSPass.cpp +++ b/CDSPass.cpp @@ -115,6 +115,7 @@ namespace { static char ID; CDSPass() : FunctionPass(ID) {} bool runOnFunction(Function &F) override; + StringRef getPassName() const override; private: void initializeCallbacks(Module &M); @@ -150,6 +151,10 @@ namespace { }; } +StringRef CDSPass::getPassName() const { + return "CDSPass"; +} + static bool isVtableAccess(Instruction *I) { if (MDNode *Tag = I->getMetadata(LLVMContext::MD_tbaa)) return Tag->isTBAAVtableAccess(); @@ -679,8 +684,15 @@ bool CDSPass::instrumentAtomicCall(CallInst *CI, const DataLayout &DL) { // atomic_init; args = {obj, order} if (funName.contains("atomic_init")) { + Value *OrigVal = parameters[1]; + Value *ptr = IRB.CreatePointerCast(OrigPtr, PtrTy); - Value *val = IRB.CreateBitOrPointerCast(parameters[1], Ty); + Value *val; + if (OrigVal->getType()->isPtrOrPtrVectorTy()) + val = IRB.CreatePointerCast(OrigVal, Ty); + else + val = IRB.CreateIntCast(OrigVal, Ty, true); + Value *args[] = {ptr, val, position}; Instruction* funcInst = CallInst::Create(CDSAtomicInit[Idx], args); @@ -746,12 +758,17 @@ bool CDSPass::instrumentAtomicCall(CallInst *CI, const DataLayout &DL) { return true; } else if (funName.contains("atomic") && - funName.contains("EEEE5store") ) { + funName.contains("store") ) { // does this version of call always have an atomic order as an argument? Value *OrigVal = parameters[1]; Value *ptr = IRB.CreatePointerCast(OrigPtr, PtrTy); - Value *val = IRB.CreatePointerCast(OrigVal, Ty); + Value *val; + if (OrigVal->getType()->isPtrOrPtrVectorTy()) + val = IRB.CreatePointerCast(OrigVal, Ty); + else + val = IRB.CreateIntCast(OrigVal, Ty, true); + Value *order = IRB.CreateBitOrPointerCast(parameters[2], OrdTy); Value *args[] = {ptr, val, order, position}; @@ -763,7 +780,12 @@ bool CDSPass::instrumentAtomicCall(CallInst *CI, const DataLayout &DL) { // atomic_fetch_*; args = {obj, val, order} if (funName.contains("atomic_fetch_") || - funName.contains("atomic_exchange") ) { + funName.contains("atomic_exchange")) { + + /* TODO: implement stricter function name checking */ + if (funName.contains("non")) + return false; + bool isExplicit = funName.contains("_explicit"); Value *OrigVal = parameters[1]; @@ -786,7 +808,12 @@ bool CDSPass::instrumentAtomicCall(CallInst *CI, const DataLayout &DL) { } Value *ptr = IRB.CreatePointerCast(OrigPtr, PtrTy); - Value *val = IRB.CreatePointerCast(OrigVal, Ty); + Value *val; + if (OrigVal->getType()->isPtrOrPtrVectorTy()) + val = IRB.CreatePointerCast(OrigVal, Ty); + else + val = IRB.CreateIntCast(OrigVal, Ty, true); + Value *order; if (isExplicit) order = IRB.CreateBitOrPointerCast(parameters[2], OrdTy);