Приведение от 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 ()
Другие вопросы по тегам