Доступ к элементам в массивах LLVM

Я пытаюсь начать работу с LLVM, чтобы добавить компиляцию точно в срок для моего кода, но мне очень трудно найти ссылки на то, как делать то, что я хочу в LLVM, несмотря на то, что он проверил учебник Kaleidoscope, справочное руководство по языку, руководство программиста и документацию doxygen. Есть ли еще ссылки на API C++ LLVM, чем эти?

Теперь о конкретном вопросе. Я выделил объект-массив с двумя элементами (который, как я полагаю, соответствует double[2]в C++):

const llvm::Type* double_t = llvm::Type::getDoubleTy(llvm::getGlobalContext());
const llvm::Type* array_t =  llvm::ArrayType::get(double_t,2)

Позже в коде я создаю функцию, где этот массив является одним из аргументов. . Затем в своей функции я извлекаю первый элемент массива и возвращаю его пользователю:

llvm::Function::arg_iterator AI = jit_function_->arg_begin();
llvm::Value *x = AI;
llvm::Value *x0 = Builder.CreateExtractValue(x,0);
Builder.CreateRet(x0);

Код работает нормально, но когда я пытаюсь его запустить, он не работает. Например:

typedef double (*GenType)(double[2]);
GenType FP = GenType(intptr_t(TheExecutionEngine->getPointerToFunction(jit_function_)));
double y[2] = {10,20};
double r = FP(y);
printf("r = %g\n", r);

Возвращаемое значение просто ерунда, и я не вижу, что я делаю неправильно. Если я передаю значения в массиве (10 и 20) в качестве скалярных аргументов функции, она работает нормально.

9
задан Joel 9 March 2012 в 16:45
поделиться