썬 스튜디오 컴파일러를 사용하여 인식 가능한 코드 시퀀스를 삽입하는 방법을 아는 사람이 있습니까?검사를 위해 생성 된 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 그 약간의 코드).
더 좋은 방법이 있습니까?
특정 기능을 호출하는 방법에 대해 분해 코드에서 통화 opcode를 인식 할 수 있습니까? –
함수 호출이 아마도 추가 레지스터 압력을 발생시키기 때문에, 덜 관입 적이기를 바랬습니다. –