2012-10-26 5 views
0

썬 스튜디오 컴파일러를 사용하여 인식 가능한 코드 시퀀스를 삽입하는 방법을 아는 사람이 있습니까?검사를 위해 생성 된 sparc 어셈블리 코드의 세그먼트 표시

썬 스튜디오 (12.1) 컴파일러가 많은 경우에 약간의 코드로 어떤 작업을하는지보고 싶습니다. 생성 된 코드를 인식 할 수없는 no- op 명령어를 사용하면 코드 조각을 찾을 수 있습니다. 내 첫번째 시도 사용 :

asm volatile ("nop ; nop ; nop ") ; 
// ... <stuff I want to look at here> ... 
asm volatile ("nop ; nop ; nop ; nop ; nop") ; 

그러나 이것을 사용하면 컴파일러는 nop 블록 내에서 최적화되지 않은 코드를 생성합니다. 예 :

nop 
nop 
nop 
ld  [%sp + 0x8bf], %g2 
srl  %g2, 0x0, %g3 
sllx  %g3, 0x2, %g4 
ld  [%sp + 0x8c3], %g5 
ldx  [%sp + 0x8c7], %o2 
st  %g5, [%o2 + %g4] 
ld  [%sp + 0x8b7], %o3 
ldx  [%sp + 0x8c7], %o4 
st  %o3, [%o4 + 0x28] 
nop 
nop 
nop 
nop 
nop 

해당 코드는 단지 2 개의 저장소입니다. 나는 sparc 어셈블리를 실제로 알지 못한다. 그러나 이것은 컴파일러가 nop 블록 내에서 코드를 최적화하는 것을 완전히 포기한 것처럼 보인다. 예를 들어, ldx [%sp + 0x8c7], %o4이라는 새로드가 생성되어 이미 %02에 완료되었을 때 저장소의 기본 주소를 다시 계산해야하는 이유는 무엇입니까?

주변 코드를 한눈에 알면 사용 된 휘발성 물질 주변의 어느 곳에서도 최적화되지 않을 수 있습니다. 내 소스에 다음과

.inline DO_Nop3,0 
    nop 
    nop 
    nop 
.end 
.inline DO_Nop5,0 
    nop 
    nop 
    nop 
    nop 
    nop 
.end 

:

내가이 인라인 어셈블리와 .IL 파일을 생성하는 대신 다음과 같은 노력이 사용

extern "C" void DO_Nop3() ; 
extern "C" void DO_Nop5() ; 

을, 나는 반대있어 문제는 컴파일러가 이제 너무 똑똑하고, 내 nop 명령어를 완전히 삭제합니다 (나는 .inline 블록의 명령어의 부작용을 살펴본 후 추후에 올바르게하지 않는다고 결정하고 tosses 그 약간의 코드).

더 좋은 방법이 있습니까?

+1

특정 기능을 호출하는 방법에 대해 분해 코드에서 통화 opcode를 인식 할 수 있습니까? –

+0

함수 호출이 아마도 추가 레지스터 압력을 발생시키기 때문에, 덜 관입 적이기를 바랬습니다. –

답변

0

문제는 컴파일러가 명령을 다시 정렬 할 수 있다는 것입니다. asm volatile 블록은 그렇게하지 못하게하여 최적화를 방해 할 수 있습니다.

디버깅 기호는 명령어 주소와 소스 행 사이의 매핑을 제공해야합니다. 나는 dwarf2/stabs를 편리하게 읽는 좋은 도구에 대해서는 잘 모르고있다.

+0

잘 최적화되어 있어야하는 불량 코드는 2 쌍의 asm 휘발성 물질이었습니다. misoptimizing에 대해 너무 많은 변명을해서는 안됩니다 (특정 예제는 % o4에 이미 있기 때문에 구조 기본 주소에 대해 % o4에로드를 수행하지 않습니다 ... 두 비트의 코드는 내부의 저장 명령어와 연관되어 있습니다 asm() 블록 쌍). –

+0

또한 최적화 된 코드에 특히 관심이 있으며 디버깅 기호가 너무 잘 작동 할 것이라고 기대하지 않습니다. –

관련 문제