18 this->module = module;
27 GlobalValue *gv = module->getNamedValue(name);
28 if((gv == NULL) || (gv->getValueID() != Value::GlobalVariableVal))
31 Value *v = gv->getOperand(0);
32 if(v->getValueID() != Value::ConstantIntVal)
35 ConstantInt *ci = (ConstantInt *)v;
36 return ci->getValue().getLimitedValue();
44 string s = resolveGlobalToConst(name);
48 return getGlobalValueConstString(s);
57 vector<string> globalConstStrings;
58 GlobalValue *gv = module->getNamedValue(name);
60 if((gv == NULL) || (gv->getValueID() != Value::GlobalVariableVal))
62 return globalConstStrings;
64 Value *v = gv->getOperand(0);
66 if(v->getValueID() != Value::ConstantArrayVal)
68 return globalConstStrings;
70 ConstantArray *constantArray = (ConstantArray *)v;
71 int numArrayElmts = constantArray->getNumOperands();
73 for(
int i = 0; i < numArrayElmts; i++)
75 Constant *arrayConstElmt = (Constant *)(constantArray->getOperand(i));
77 if(arrayConstElmt->getValueID() == Value::ConstantExprVal)
79 ConstantExpr *ce = (ConstantExpr *)arrayConstElmt;
81 if(ce->getOpcode() == Instruction::GetElementPtr)
84 Value *gv2 = ce->getOperand(0);
86 if(gv2->getValueID() == Value::GlobalVariableVal)
88 string constantName = gv2->getName().str();
89 string constantVal = getGlobalValueConstString(constantName);
90 globalConstStrings.push_back(constantVal);
95 return globalConstStrings;
98 string VuoCompilerBitcodeParser::resolveGlobalToConst(
string name)
100 GlobalValue *gv = module->getNamedValue(name);
101 if((gv == NULL) || (gv->getValueID() != Value::GlobalVariableVal))
104 Value *v = gv->getOperand(0);
105 if(v->getValueID() != Value::ConstantExprVal)
107 ConstantExpr *ce = (ConstantExpr *)v;
108 if(ce->getOpcode() != Instruction::GetElementPtr)
112 Value *gv2 = ce->getOperand(0);
114 if(gv2->getValueID() != Value::GlobalVariableVal)
117 return gv2->getName().str();
120 string VuoCompilerBitcodeParser::getGlobalValueConstString(
string name)
122 GlobalValue *gv = module->getNamedValue(name);
125 Value *v = gv->getOperand(0);
126 if(v->getValueID() != Value::ConstantDataArrayVal)
129 ConstantDataArray *ca = (ConstantDataArray *)v;
130 string caStr = ca->getAsCString().str();
139 return module->getFunction(name);
148 return argumentNameInBitcode.substr(0, argumentNameInBitcode.find(
'.'));
156 vector<pair<Argument *, string> > annotatedArguments;
159 BasicBlock *b = &
function->getEntryBlock();
162 BitCastInst *precedingBitCastInst = NULL;
163 for(BasicBlock::iterator it = b->begin();it!=b->end();++it)
165 Instruction *inst = &(*it);
166 if(! CallInst::classof(inst))
168 if (BitCastInst::classof(inst))
169 precedingBitCastInst =
static_cast<BitCastInst *
>(inst);
174 Value *calledFunction = inst->getOperand(inst->getNumOperands()-1);
175 if(calledFunction->getName().str() !=
"llvm.var.annotation")
182 Value *annotatedValue;
183 if (precedingBitCastInst)
186 annotatedValue = precedingBitCastInst->getOperand(0);
187 precedingBitCastInst = NULL;
192 annotatedValue = inst->getOperand(0);
197 Argument *argument = NULL;
199 for (Function::arg_iterator i = function->arg_begin(); i != function->arg_end(); ++i)
201 Argument *currArgument = i;
203 if (argNamePrefix == annotationNamePrefix)
205 argument = currArgument;
212 for (Function::arg_iterator i = function->arg_begin(); i != function->arg_end(); ++i)
214 Argument *currArgument = i;
215 if (currArgument->getName().empty())
217 argument = currArgument;
218 argument->setName(annotationNamePrefix +
".workaround");
226 Value *annotation = inst->getOperand(1);
227 if(annotation->getValueID() != Value::ConstantExprVal)
229 ConstantExpr *ce = (ConstantExpr *)annotation;
230 if(ce->getOpcode() != Instruction::GetElementPtr)
234 Value *gv = ce->getOperand(0);
236 if(gv->getValueID() != Value::GlobalVariableVal)
239 string annotationName = getGlobalValueConstString(gv->getName().str());
241 annotatedArguments.push_back(pair<Argument *, string>(argument, annotationName));
244 return annotatedArguments;