From 90c8d2987f1be0325adcc75df9e4f366b2dd7fb1 Mon Sep 17 00:00:00 2001 From: weiyu Date: Mon, 4 Nov 2019 15:19:21 -0800 Subject: [PATCH] Fix a bug related to atomic bool --- CDSPass.cpp | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/CDSPass.cpp b/CDSPass.cpp index 432d98f..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); @@ -751,7 +763,12 @@ bool CDSPass::instrumentAtomicCall(CallInst *CI, const DataLayout &DL) { 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); -- 2.34.1