3.3.9. 분기 인라이닝

armlink는 사용자의 모든 프로그램 코드에 대한 전역적 가시성을 확보하고 있으므로 추가 분기 최적화를 수행할 수 있습니다.

armlink는 분기 인라이닝을 사용하여 이미지의 작은 함수 호출을 최적화합니다. 작은 함수는 4바이트의 BL 또는 BLX 명령어로 인라이닝될 수 있는 한 개 명령어 함수로 정의됩니다. 이 경우에는 분기가 없고 따라서 복귀 주소는 중복적입니다.

Note

이 분기 최적화를 활성화하면 디버그 정보가 부정확하도록 이미지가 변경되므로 기본적으로 해제됩니다. 활성화되면 링커는 디버그 정보를 수정하려 하지 않습니다.

다음 명령 행 옵션을 사용하여 분기 인라이닝을 제어하십시오.

--no_branchnop

링커는 분기를 NOP이 포함된 다음 명령어로 처리되는 재배치로 대체합니다. 이것이 기본 동작입니다. 그러나 확인 또는 파이프라인 플러시 수행 시와 같이 옵션을 비활성화하고자 할 경우가 있습니다.

이 동작을 비활성화하려면 --no_branchnop 옵션을 사용하십시오.

--inline

분기 인라이닝을 활성화합니다(인라이닝 제어 참조).

--tailreorder

가능한 경우 해당 타겟 바로 앞의 마무리 호출 섹션을 이동하여 함수 호출을 최적화합니다(마무리 호출 섹션 처리 참조).

분기 인라이닝을 활성화하면 armlink가 이미지의 각 함수 호출을 검색한 다음 적용 가능한 경우 인라이닝합니다. armlink가 함수를 인라이닝하면 호출자에서 호출된 함수에 대한 참조를 제거합니다. armlink는 항상 인라이닝되는 섹션이 제거될 수 있도록 사용하지 않는 섹션이 제거되기 전에 이 최적화를 적용합니다.

분기 인라이닝에 대한 정보를 표시하려면 --info 명령 행 옵션을 사용하십시오.

--info inline

함수가 인라이닝될 때마다 메시지를 표시하고 총 인라인 수를 표시합니다. 예를 들면 다음과 같습니다.

Small function inlining results

Inlined function __Heap_DescSize from object h1_alloc.o at offset 0x5c in section .text from object malloc.o.
Inlined function __ieee_status from object istatus.o at offset 0x40 in section .text from object _printf_fp_dec.o.
.
Inlined total of 6 calls.

인라이닝 제어

분기 인라이닝을 활성화한 경우 함수가 인라이닝된 순서로 충족해야 하는 특정 조건이 있습니다.

  • armlink는 가장 단순한 경우만 처리하고 PC에 대한 읽기 또는 쓰기는 함수의 위치에 따라 다르기 때문에 이를 지시하는 명령어는 인라이닝하지 않습니다.

  • 이미지에 ARM 및 Thumb 코드가 모두 있는 경우 인터워킹을 위해 다른 상태에서 호출된 함수를 작성해야 합니다. ARM 호출자는 해당하는 ARM 명령어가 사용 가능한 경우 Thumb 호출 수신자를 인라이닝할 수 있습니다. 그러나 Thumb 호출자는 ARM 호출 수신자를 인라이닝할 수 없습니다. 또한, armlink는 최대 2개의 16비트 Thumb 명령어를 인라이닝할 수 있습니다. 그러나 ARM 호출자는 한 개의 16비트 Thumb 명령어만 인라이닝할 수 있습니다.

  • 링커의 작업은 Table 3.2에 표시된 대로 함수를 나타내는 심볼의 크기와 호출자(ARM 또는 Thumb) 및 호출 수신자(ARM 또는 Thumb)에 따라서도 달라집니다.

    Table 3.2. 작은 함수 인라이닝

    호출자호출 수신자인라이닝할 수 있는 심볼 크기
    ARMARM4 ~ 8바이트
    ARMThumb2 ~ 6바이트
    ThumbThumb2 ~ 6바이트
    ThumbARM4 ~ 8바이트
  • 인라이닝되기 위해서는 함수의 마지막 명령어가 다음 중 하나여야 합니다.

    MOV pc, rn
    

    또는

    BX rn
    

    복귀 시퀀스로만 구성된 함수는 NOP로 인라이닝될 수 있습니다.

  • BL에 대한 조건이 인라이닝할 명령에 대한 조건과 일치하거나 BL 또는 인라이닝할 명령이 무조건 명령인 경우 조건부 ARM 명령만 인라이닝할 수 있습니다. 예를 들어 BLEQADD 같은 무조건 명령이나 ADDEQ처럼 조건이 일치하는 명령만 인라이닝할 수 있습니다.

    무조건 ARM BL은 조건부 명령이나 다른 기준을 모두 충족하는 모든 무조건 명령을 인라이닝할 수 있습니다.

  • IT 블록의 마지막 명령어인 BL은 16비트 Thumb 명령어나 32비트 MRS, MSR 또는 CPS 명령어를 인라이닝할 수 없습니다. IT 블록이 해당 범위 내에서 명령어의 동작을 변경하므로 명령어를 인라이닝하면 프로그램의 동작이 변경되기 때문입니다.

마무리 호출 섹션 처리

링커는 인라이닝 제어에서 설명한 것처럼 분기를 NOP가 포함된 다음 명령어로 처리되는 재배치로 대체합니다. 이것은 마무리 호출 섹션, 즉 분기 명령어로 끝나는 섹션의 경우 실행 영역에서 섹션의 타겟이 해당 섹션 바로 뒤에 나타날 수 있도록 최적화될 수 있음을 의미합니다.

타겟 위로 마무리 호출 섹션을 이동하려면 명령 행 옵션 --tailreorder를 사용하여 이 동작을 이용할 수 있습니다. 이 경우 다음 사항을 유의하십시오.

  • armlink는 각각의 마무리 호출 타겟에 대해 하나의 마무리 호출 섹션만 이동할 수 있습니다. 한 섹션에 여러 마무리 호출이 있는 경우 섹션 이름이 같은 마무리 호출 섹션이 타겟 앞으로 이동됩니다. 마무리 호출 섹션에 같은 섹션 이름이 없으면 링커가 만나는 첫 번째 섹션을 이동합니다.

  • armlink는 마무리 호출 섹션을 실행 영역 밖으로 이동할 수 없습니다.

  • armlink는 인라인 비니어 앞으로 마무리 호출 섹션을 이동하지 않습니다.

마무리 호출 최적화에 대한 정보를 표시하려면 --info 명령 행 옵션을 사용하십시오. 예를 들어 --info tailreorder는 이동된 마무리 호출 섹션에 대한 정보를 제공합니다.

Tailcall reorder results
Tail calling Section !!!main from object __main.o placed before .text from kernel.o
Tail calling Section .text from object rt_raise.o placed before .text from sys_exit.o
Tail calling Section .text from object plibspace.o placed before .text from libspace.o
Tail calling Section .text from object aeabi_idiv0.o placed before .text from rt_div0.o
......

Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0206GK
Non-Confidential