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(
'.'));
158 Function *
function = firstArgument->getParent();
159 for (Function::arg_iterator i = function->arg_begin(); i !=
function->arg_end(); ++i)
161 Argument *currArgument = i;
162 if (currArgument == firstArgument)
164 if (++i != function->arg_end())
166 Argument *secondArgument = i;
170 return (firstArgumentName == secondArgumentName);
183 vector<pair<Argument *, string> > annotatedArguments;
186 BasicBlock *b = &
function->getEntryBlock();
189 BitCastInst *precedingBitCastInst = NULL;
190 for(BasicBlock::iterator it = b->begin();it!=b->end();++it)
192 Instruction *inst = it;
193 if(! CallInst::classof(inst))
195 if (BitCastInst::classof(inst))
196 precedingBitCastInst = static_cast<BitCastInst *>(inst);
201 Value *calledFunction = inst->getOperand(inst->getNumOperands()-1);
202 if(calledFunction->getName().str() !=
"llvm.var.annotation")
209 Value *annotatedValue;
210 if (precedingBitCastInst)
213 annotatedValue = precedingBitCastInst->getOperand(0);
214 precedingBitCastInst = NULL;
219 annotatedValue = inst->getOperand(0);
224 Argument *argument = NULL;
226 for (Function::arg_iterator i = function->arg_begin(); i !=
function->arg_end(); ++i)
228 Argument *currArgument = i;
230 if (argNamePrefix == annotationNamePrefix)
232 argument = currArgument;
239 for (Function::arg_iterator i = function->arg_begin(); i !=
function->arg_end(); ++i)
241 Argument *currArgument = i;
242 if (currArgument->getName().empty())
244 argument = currArgument;
245 argument->setName(annotationNamePrefix +
".workaround");
253 Value *annotation = inst->getOperand(1);
254 if(annotation->getValueID() != Value::ConstantExprVal)
256 ConstantExpr *ce = (ConstantExpr *)annotation;
257 if(ce->getOpcode() != Instruction::GetElementPtr)
261 Value *gv = ce->getOperand(0);
263 if(gv->getValueID() != Value::GlobalVariableVal)
266 string annotationName = getGlobalValueConstString(gv->getName().str());
268 annotatedArguments.push_back(pair<Argument *, string>(argument, annotationName));
271 return annotatedArguments;