Учитывая, что вы предоставили выражение назначения адреса для j, я полагаю, что переменные не глобальные, а скорее расположены внутри функции.
Итак, чтобы перевести этот фрагмент кода C в LLVM IR, вы сначаланеобходимо выделить место в стеке для переменной i и указателя j, а затем сохранить константу 3 по адресу i и по адресу i по адресу указателя j.
В LLVM IR:
%i = alloca i64, align 8 ;allocation for i. %i is a pointer i64* to variable i
%j = alloca i64*, align 8 ;respectively, the type of %j is i64** (pointer to i64*)
store i64 3, i64* %i, align 8 ; i=3
store i64* %i, i64** %j, align 8 ; store %i (the address of var i) to the address of pointer j
Я не знаю, как сгенерировать эти инструкции, используя LLVM C API, потому что я никогда не использовал их.Тем не менее, мы надеемся, что между API C и C ++ может существовать связь, и, возможно, предоставление кода, который я напишу с использованием API C ++, может помочь вам понять тип аргументов, которые вы должны использовать.Надеюсь, это поможет.
AllocaInst *alloc_i = new AllocaInst(Type::getInt64Ty(M.getContext()), //Type i64
0, //AddressSpace
nullptr, //Arraysize
8, //Alignment
"i", //name of result in IR. Leave "" for default
I); //Add alloca instruction before Instruction I
AllocaInst *alloc_j = new AllocaInst(Type::getInt64PtrTy(M.getContext()), //Type i64*
0, //AddressSpace
nullptr, //Arraysize
8, //Alignment
"i", //name of result in IR. Leave "" for default
I); //Add alloca instruction before Instruction I
StoreInst *store_i = new StoreInst(ConstantInt::get(Type::getInt64Ty(M.getContext()), 3), //get constant 3 of type i64
alloc_i, //store to the result Value* of alloc_i
false,
8, //Alignment
I); //Insert before instr I
StoreInst *store_j = new StoreInst(alloc_i, //i64* pointer to i
alloc_j, //store to the address of pointer j
false,
8, //Alignment
I); //Insert before instr I
Наконец, рассмотрите возможность использования C ++ API.