2010-12-10 6 views
1

Valgrind는 프로그래밍 언어 수준 구문을 처리 할 필요가 없도록 중간 코드 표현을 사용하여 이진 코드를 구현합니다. 이진 코드를 Valgrind의 Intermediate Representation (IR) 코드로 변환하는 과정에서 추가 등의 작업을 위해 레지스터를 사용하는 방법을 보여줍니다. 사용되는 1024 개가 있습니다. 내가 얻지 못하는 것은 tX으로 표현되는 임시 레지스터라는 다른 유형의 레지스터입니다. 여기서 X는 숫자입니다. 따라서 이것을 볼 수 있습니다 :레지스터와 임시 레지스터의 차이점은 무엇입니까?

t28 = Add32(t26,0xFFFFFFFC:I32) 
t4 = LDle:I32(t28) 

t 임시 레지스터를 의미합니다. 내가 볼 수있는 한, 그들은 정규 레지스터와 매우 비슷한 것처럼 보이지만 어떻게 다른지 알아낼 수는 없습니다. 누군가가 임시 등록기가 무엇인지, 정규 등록기와 다른 점을 말해 줄 수 있습니까?

+1

나는 여기서 명백한 것이 빠졌을 것이다. 그러나 나는 그 예에서'R'도 아니고'T'도 보지 못했다 ...? –

+0

@Laurence : 내 질문이 수정되었습니다. 그것을 지적 주셔서 감사합니다. – Legend

답변

2

컴파일러 생성 클래스에서 중간 코드의 레지스터는 가상 레지스터라는 것을 알게되었습니다. 그들은 반드시 대상 플랫폼에 대한 실행 파일과 관련이 없습니다. 실제 CPU 레지스터 일 수도 있고 임시 메모리 일 수도 있습니다. 그것은 모두 코드 생성기와 최적화 프로그램에 달려 있습니다. 임시 저장 장치를 할당해야하는 위치를 결정하는 코드 생성기입니다.

IR을 생성해야하는 큰 이유는 컴파일러의 이식성을 최대화하기 위해서입니다. 모든 플랫폼에 하나의 컴파일러 프론트 엔드를 사용하고 IR을 플랫폼 특정 코드 생성기에 전달할 수 있습니다. GCC는 이런 방식으로 작동하며, 모든 컴파일러가 아니라면 대부분의 컴파일러가 이런 식으로 작동합니다.

또 다른 이점은 코드 생성기로 전송되기 전에 IR 코드에 대한 특정 최적화를 수행 할 수 있다는 것입니다. 일부 최적화는 플랫폼에 따라 다르지 않습니다. 예를 들어 루프에 의해 영향을받지 않는 코드는 루프에서 빠져 나올 수 있습니다. 플랫폼 최적화 도구는 일반적으로 레지스터 할당, 분기 등과 같이 CPU의 속성에 실제로 의존하는 낮은 수준에서 최적화합니다.

+0

굉장합니다. 자세한 설명을 해주셔서 감사합니다. – Legend

관련 문제