Я пишу проход LLVM, который записывает значение глобальной переменной, когда opt вызывается с -var [global_variable_name].Но я не могу узнать, как писать строки, определенные как char * string = "help";в исходном коде .c
Я пробовал:
if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) {
writeConstant(Out, CE->getAggregateElement(CV));
return;
}
, но это привело к SEGFAULT.
Это часть функции для записи глобальной переменной типа int:
void writeConstant(raw_ostream &Out, const Constant *CV)
{
if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) {
if (CI->getType()->isIntegerTy(1)) {
Out << (CI->getZExtValue() ? "true" : "false");
return;
}
}
APInt AI = CI->getValue();
if( CI->getBitWidth() == 8) { // if sizeof constant == sizeof char
const uint64_t *letter = AI.getRawData();
if(char letter2 = (char) (*letter)) {
Out << letter2;
return;
}
}
Out << CI->getValue();
return;
}
Ожидаемый результат:
В testsource.c есть строка в следующем виде:
char *testString = "Hello";
Вызов в bash:
opt -load pass.so -var testString < testsource.bc > /dev/null
Вывод команды выше:
Hello