2017-02-18 4 views
1

레지스터가 R0, R1,...,Rn 인 알고리즘을 적용하고 싶습니다.LLVM IR을 통한 x86 레지스터 제어?

이 경우 내가 제어하고자하는 것은 이러한 레지스터가 할당되는 순서입니다.

LLVM IR 레벨에서 레지스터를 제어 할 수 있습니까? 아니면 IR이 이러한 저레벨 세부 사항을 멀리 차폐합니까?

+0

이 인라인 어셈블리를 사용할 수 있습니다. 이는 원하는 것이 아닐 수도 있습니다. IR은이 측면에서 어셈블리 레벨보다 C 레벨입니다. – Joky

+0

인라인 어셈블리에는 어떤 메서드 호출을 사용할 수 있습니까? – Shuzheng

+0

나는 그 질문을 이해하지 못합니까? – Joky

답변

0

최신 버전의 llvm에서 llvm.read_register 및 llvm.write_register를 사용할 수 있습니다. 당신이 좋은 예를 원하는 경우

,과 같이 전역 변수를 만들어보십시오 :

register void *rsp asm("rsp"); 

그런 다음 printf와 함께 인쇄 해보십시오. -S -emit - LLVM과 간단한 C 프로그램을 컴파일하고 llvm.read_register이

%4 = call i64 @llvm.read_register.i64(metadata !0) 

을 사용 그리고 당신은 메타 데이터 인덱스 0을 볼 수있는 파일의 하단에 볼 수있는 것은 :

!0 = !{!"rsp"} 
+0

하지만 'mov rax, rsp' 또는 그 이상으로 변하지 않을까요? '% 4' 레지스터가 저장되는 것을 제어 할 수는 없습니다. –

+0

항상 올바르지는 않지만 옵티 마이저가 아닌 경우에도 문제가 발생합니다. 인라인 어셈블리는 아마도 OP가 원하는 것을 할 수있는 최선의 방법 일 것입니다. – keyboardsmoke