2013-04-25 2 views
3

기본적으로 LLVM IR 코드의 일부를 취하고 인라인 인 C에서 실행하는 방법을 알아 내려고 노력했습니다. IR 코드를 인라인 할 수 있기를 바랍니다. 가상 함수 호출이 필요하지 않습니다 (어셈블리 코드가 _asm{}을 사용하여 인라인 될 수있는 것과 동일한 방식으로). 실행C에서 LLVM IR 코드 실행

LLVM의 IR 코드 : 다음 예를 참조하십시오

define i64 @square(i64 %x){ 
    %y = mul i64 %x, %x 
    ret i64 %y 
} 

C 프로그램 :

for(i = 0; i < length; i++){ 
    //run LLVM IR Code here 
} 

을 내가 parseIRFile()를 사용하여 적외선 코드를 읽고 함수에 대한 포인터를 만들 수 있습니다 알고 그러나 그것은 가상 함수 호출이 필요하므로 내가 찾고있는 것이 아닙니다.

+0

무슨 "가상 전화"에 대해 이야기하고 있습니까? 'for (i = 0; i <길이; i ++) {square (i); } 정상적인 호출이 될 것입니다. '-O4' 옵션을 사용해서 C 부분을 Clang으로 컴파일하면, 링커는 루프에'inline '을 할 것입니다. –

답변

2

우선 가상 기능이 포함되어 있지 않습니다. C에는 그런 개념이 없습니다. 제 말은 간접적 인 함수 호출, 즉 함수 포인터를 가져오고 가리키는 함수를 호출한다는 것입니다.

짧은 대답은 아니요이므로 LLVM IR을 C에 포함시키고 코드로 컴파일하도록하는 직접적인 방법은 없습니다. see this related question and my answer. 여기서 언급했듯이 프로그래머가 LLVM IR을 작성하고 직접 함수 호출을 사용하도록하려는 경우 함수에 IR을 캡슐화하고 별도의 파일에 저장해야합니다.

IR을 퍼포먼스보다 중요하게 생각한다면 ParseIR() 경로로 가야합니다 (ParseIRFile() 필요 없음 - 메모리에서 직접 구문 분석 가능).

하이브리드 C/IR 입력 파일을 사용하여 두 파일로 분할 한 다음 함께 컴파일하여 빌드 프로세스에 스크립트를 도입 할 수 있다고 생각합니다. IR에서 디버그 정보를 적절하게 수정하여 그것은 C 파일에 포함되었습니다. 그러나 그것은 매우 해킹 된 접근법이며, 입력 파일은 합법적 인 C 파일이 아니어도됩니다.