Приведение от uint8_t* к StringRef
Я использую ExecutionEngine.cpp. Я хочу получить StringRef из найденных адресов с помощью следующего кода:
const APInt &IntVal;
uint8_t *y2 = reinterpret_cast<uint8_t *>(const_cast<uint64_t *>(IntVal.getRawData()));
int v2 = *reinterpret_cast<int *>(y2);
StringRef* Src1V=cast<StringRef>(y2);
Я получил эту ошибку:
home/rasha/llvm/llvm/include/llvm/Support/Casting.h:236:3: required from ‘typename llvm::cast_retty<X, Y*>::ret_type llvm::cast(Y*) [with X = llvm::StringRef; Y = unsigned char; typename llvm::cast_retty<X, Y*>::ret_type = llvm::StringRef*]’
/home/rasha/llvm/llvm/lib/ExecutionEngine/Interpreter/Execution.cpp:1291:38: required from here
/home/rasha/llvm/llvm/include/llvm/Support/Casting.h:56:28: error: ‘classof’ is not a member of ‘llvm::StringRef’
return To::classof(&Val);
Не могли бы вы объяснить мне ошибку? Обратите внимание, что я использовал приведение с теми же типами в Execution.cpp, без ошибок.
1 ответ
Строки все представлены внутри LLVM IR как ConstantDataSequential
Подкласс Constant. если вы хотите stringref, вы должны явно указать LLVM сделать это за вас, вызвав соответствующие API ConstantDataSequential
,
Чтобы быть конкретным, вам нужно вызвать один или несколько из следующих LLVM API после приведения полученного указателя:
isString (unsigned CharSize=8)
isCString ()
getAsString ()
getAsCString ()