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

How to use inline assembly using the llvm-c API

我不知道如何将所有内容拼凑在一起。

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

asm volatile("nop");

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

我已阅读:

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");

我刚遇到段错误。问题不在于“虚拟”数组。我在其他地方使用它没有任何问题。在这种情况下,它只是一个 0 大小的空列表。

不胜感激。

缺少的成分是:

LLVMTypeRef functy = LLVMFunctionType(voidty, (LLVMTypeRef *)ptypes->data, ptypes->size, 0);

因此整个答案是:

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, "");