如何使用 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, "");
我不知道如何将所有内容拼凑在一起。
我想为以下“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, "");