如何使用 llvm-c API 进行内联汇编

Pau*_*tte 2 c llvm

我不知道如何将所有东西拼凑在一起。

我想为以下“C”指令生成 llvm-ir:

asm volatile("nop");
Run Code Online (Sandbox Code Playgroud)

将来我想包括更先进的内联汇编,但这将是一个好的开始。

我读过了:

https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

https://llvm.org/docs/LangRef.html#inline-assembler-expressions

我的最后一次尝试如下:

char myasm[256]="nop";
char myconstraint[256]={0};

LLVMTypeRef voidty=LLVMVoidType();
LLVMValueRef asmcall=LLVMGetInlineAsm(voidty,myasm,strlen(myasm),
             myconstraint,strlen(myconstraint),1,1,LLVMInlineAsmDialectIntel);
LLVMSetVolatile(asmcall,1);
LLVMValueRef call = LLVMBuildCall( llbuilder, asmcall, (LLVMValueRef *)dummy->data,
             dummy->size, "acall");
Run Code Online (Sandbox Code Playgroud)

我只是遇到了段错误。问题不在于“虚拟”数组。我在其他地方使用它没有任何问题。在本例中,它只是一个大小为 0 的空列表。

如有帮助,将不胜感激。

Pau*_*tte 6

缺少的成分是:

LLVMTypeRef functy = LLVMFunctionType(voidty, (LLVMTypeRef *)ptypes->data, ptypes->size, 0);
Run Code Online (Sandbox Code Playgroud)

因此,整个答案是:

char myasm[256]="nop";
char myconstraint[256]={0};

LLVMTypeRef voidty = LLVMVoidType();
LLVMTypeRef functy = LLVMFunctionType(voidty, (LLVMTypeRef *)ptypes->data, ptypes->size, 0);
LLVMValueRef asmcall = LLVMGetInlineAsm(functy,myasm,strlen(myasm),
         myconstraint,strlen(myconstraint),1,1,LLVMInlineAsmDialectIntel);
LLVMValueRef call = LLVMBuildCall2( llbuilder, functy, asmcall,
         (LLVMValueRef *)pvalues->data,pvalues->size, "");
Run Code Online (Sandbox Code Playgroud)