static inline uint64_t sd_getNumberFromMDTuple(const MDOperand& op) { Metadata* md = op.get(); assert(md); ConstantAsMetadata* cam = dyn_cast_or_null<ConstantAsMetadata>(md); assert(cam); ConstantInt* ci = dyn_cast<ConstantInt>(cam->getValue()); assert(ci); return ci->getSExtValue(); }
// Parse an MDTuple representing (Key, Val) pair. static bool getVal(MDTuple *MD, const char *Key, uint64_t &Val) { if (!MD) return false; if (MD->getNumOperands() != 2) return false; MDString *KeyMD = dyn_cast<MDString>(MD->getOperand(0)); ConstantAsMetadata *ValMD = dyn_cast<ConstantAsMetadata>(MD->getOperand(1)); if (!KeyMD || !ValMD) return false; if (!KeyMD->getString().equals(Key)) return false; Val = cast<ConstantInt>(ValMD->getValue())->getZExtValue(); return true; }
bool TaskDebugBranchCheck::hasAnnotation(Instruction* i, Value *V, StringRef Ann, uint8_t level) { // Check instruction metadata. //errs() << "0th If\n"; if (Instruction *I = dyn_cast<Instruction>(V)) { if (I->getOpcode() == Instruction::GetElementPtr) { MDNode *MD = i->getMetadata("tyann"); if (MD) { MDString *MDS = cast<MDString>(MD->getOperand(0)); if (MDS->getString().equals(Ann)) { return true; } else return false; } else return false; } MDNode *MD = I->getMetadata("tyann"); //errs() << *V << " 1st If\n"; if (MD) { //errs() << "2nd If\n"; MDString *MDS = cast<MDString>(MD->getOperand(0)); if (MDS->getString().equals(Ann)) { //errs() << "3rd If\n"; //return true; #if 1 ConstantAsMetadata *CAM = cast<ConstantAsMetadata>(MD->getOperand(1)); ConstantInt *CI = cast<ConstantInt>(CAM->getValue()); if (CI->getValue() == level) { //errs() << CI->getValue() << "Level true\n"; return true; } else { //errs() << CI->getValue() << "Level false\n"; return false; } #endif } } } else if (GlobalValue *G = dyn_cast<GlobalValue>(V)) { MDNode *MD = i->getMetadata("tyann"); if (MD) { //errs() << "2nd If\n"; MDString *MDS = cast<MDString>(MD->getOperand(0)); if (MDS->getString().equals(Ann)) { //errs() << "3rd If\n"; return true; #if 0 ConstantAsMetadata *CAM = cast<ConstantAsMetadata>(MD->getOperand(1)); ConstantInt *CI = cast<ConstantInt>(CAM->getValue()); if (CI->getValue() == level) { //errs() << CI->getValue() << "Level true\n"; return true; } else { //errs() << CI->getValue() << "Level false\n"; return false; } #endif } } } // TODO: Check for annotations on globals, parameters. return false; }