2.3.12. 코드 생성 제어

이 장에서 설명하는 옵션을 지정하여 최적화와 같은 컴파일러에서 생성된 코드를 제어할 수 있습니다. Pragma를 사용하여 제어하는 다른 코드 생성 옵션에 대한 자세한 내용은 Pragma를 참조하십시오.

이 장에서는 다음 내용을 설명합니다.

명령어 세트 타겟 작성

이 옵션으로 타겟 명령어 세트를 제어합니다.

--arm

ARM 명령어 세트를 타겟으로 하도록 컴파일러를 구성합니다. 이것이 기본값입니다.

--thumb

Thumb 명령어 세트를 타겟으로 하도록 컴파일러를 구성합니다. 이것은 __thumb__thumb__을 사전 정의합니다.

코드 생성을 제어하는 pragma에서 #pragma arm#pragma thumb의 설명도 참조하십시오. 이러한 pragma를 사용하여 ARM 또는 Thumb에 대한 특정 함수를 컴파일할 수 있습니다.

ARMv4T 또는 ARMv5를 지원하는 프로세서에 대한 ARM/Thumb 혼합 시스템용으로 만들어진 코드를 컴파일하는 경우 인터워킹 옵션 --apcs /interwork를 지정해야 합니다. ARMv5 이상을 지원하는 프로세서에서는 기본적으로 사용할 수 있습니다. 자세한 내용은 인터워킹 한정자를 참조하십시오. 인터워킹은 RealView Compilation Tools 버전 3.0 개발자 설명서에 자세히 설명되어 있습니다.

명령 행에 armcc --thumb --fpu vfp를 입력하면 컴파일러에서 Thumb 명령어 세트를 사용하는 코드를 가능한 많이 컴파일합니다. 그러나 컴파일러에서 컴파일 중 일부에 사용되는 ARM 코드를 생성할 수 있습니다.

명령 행에 armcc --thumb을 입력하면 컴파일러에서 Thumb 명령어 세트를 사용하는 코드를 가능한 많이 컴파일합니다. 그러나 컴파일러에서 컴파일 중 일부에 사용되는 ARM 코드를 생성할 수 있습니다. 특히 Thumb-2 이전 프로세서 코드를 컴파일하고 VFP를 사용하는 경우 부동 소수점 연산이 포함된 any 함수가 ARM에 대해 컴파일됩니다.

--fpu name 인수에 대한 자세한 내용은 타겟 프로세서 또는 아키텍처 지정을 참조하십시오.

바이트 순서 설정

이 옵션은 엔디안을 제어합니다.

--littleend

리틀엔디안 메모리를 사용하여 ARM 프로세서 코드를 생성합니다. 리틀엔디안 메모리를 사용하면 워드의 최하위 바이트가 최하위 주소를 차지합니다. 이것이 기본값입니다.

--bigend

빅엔디안 메모리를 사용하여 ARM 프로세서에 대한 코드를 생성합니다. 빅엔디안 메모리를 사용하면 워드의 최상위 바이트가 최하위 주소를 차지합니다.

armlink 명령 행 옵션 --be8--be32가 있는 링크 타임에 바이트 불변 주소 지정 모드와 워드 불변 주소 지정 모드 사이에서 선택합니다(자세한 내용은 RealView Compilation Tools 버전 3.0 링커 및 유틸리티 설명서 참조).

최적화 기준 정의

최적화 옵션은 다음 항목으로 그룹화할 수 있습니다.

여러 최적화 옵션

이 장에서는 한 가지 옵션으로 multi 최적화를 제어하는 방법에 대해 설명합니다.

pragma를 사용하여 각 함수에서 -Onum, -Ospace-Otime 최적화를 적용할 수도 있습니다. 자세한 내용은 여러 개의 최적화 작업을 제어하는 pragma를 참조하십시오.

Note

접두사가 -O인 최적화 옵션은 소문자로 지정합니다. 그러나 접두사 -O는 대문자여야 합니다.

여러 최적화 옵션은 다음과 같습니다.

-O, num

사용할 최적화 수준을 지정합니다.

-O0

최소 최적화. 대부분의 최적화를 해제합니다. 최상의 디버그 뷰를 제공하는 반면 가장 낮은 수준의 최적화 수준을 제공합니다.

-O1

제한적 최적화. 사용하지 않는 인라인 함수와 사용하지 않는 정적 함수를 제거합니다. 디버그 뷰를 심각하게 저하시키는 최적화를 해제합니다. 이 옵션을 --debug(디버그 테이블 생성 옵션 참조)와 같이 지정할 경우 코드가 한결 간결해진 만족스러운 디버그 뷰가 제공됩니다.

-O2

높은 최적화. --debug(디버그 테이블 생성 옵션 참조)와 같이 지정할 경우 소스 코드로의 오브젝트 코드 매핑이 명확하지 않은 경우도 있기 때문에 다소 만족스럽지 않은 디버그 뷰가 제공될 수 있습니다.

이것이 기본 최적화 수준입니다.

-O3

최대 최적화. -O3-O2와 동일한 최적화를 수행하지만 -O2와 달리 생성된 코드에서 공간 최적화와 시간 최적화 중 어느 한 쪽에 우선 순위를 지정할 수 있습니다. 즉 다음과 같습니다.

  • -O3 -Otime은 이미지 크기가 증가되기는 하지만 -O2 -Otime보다 빠른 코드를 생성하기 위해 사용합니다.

  • -O3 -Ospace-O2 -Ospace보다 작은 코드를 생성하도록 사용하지만 성능이 저하될 수 있습니다.

또한 -O3은 다음과 같이 보다 적극적인 추가 최적화를 수행합니다.

  • 루프 언롤링을 비롯한 고급 수준의 스칼라 최적화 기능. 코드 크기를 작게 작성하기 때문에 상당한 성능상의 장점이 있지만 빌드 시간이 느립니다.

  • -O3 -Otime에 대한 보다 적극적인 인라이닝 및 자동 인라이닝

  • multifile 컴파일(기본값)(multifile 컴파일 참조)

Note

부동 소수점 코드의 경우 -O3은 ISO C 및 C++ 표준 규격을 준수하지 않아도 됩니다. -O3 --fpmode=std를 지정하여 ISO 규격을 준수하도록 합니다. 자세한 내용은 --fpmode의 설명을 참조하십시오.

Note

해당 최적화에 대한 구현 정보는 이후 릴리스에서 변경될 수 있으므로 신뢰하지 마십시오.

-Ospace

실행 시간이 늘어나더라도 이미지 크기를 줄이기 위해 최적화를 수행하도록 컴파일러에 지시합니다. 예를 들어 인라인 코드 대신 라인 외부 함수 호출을 통해 대규모 구조 복사가 수행됩니다. 성능보다 코드 크기가 중요하다면 이 옵션을 지정하십시오. 이것이 기본값입니다.

-Otime

이미지 크기가 커지더라도 실행 시간을 줄이기 위해 최적화를 수행하도록 컴파일러에 지시합니다. 코드 크기보다 실행 시간이 중요하다면 이 옵션을 지정하십시오. 예를 들어 다음과 같이 컴파일합니다.

while (expression) body;

as:

if (expression) {
    do body;
    while (expression);
}

-Otime-Ospace를 지정하지 않은 경우 컴파일러에서 -Ospace를 사용합니다. -Otime으로 시간이 중요한 코드의 일부를 컴파일하고 -Ospace로 나머지를 컴파일할 수 있습니다.

같은 컴파일러 호출에서 -Otime-Ospace를 모두 지정하면 가장 마지막 옵션이 최우선합니다(명령 행 옵션 순서 지정 참조).

--feedback filename

이전에 ARM 링커를 실행하여 생성한 피드백 파일을 지정합니다. 피드백 파일에는 링커가 코드에서 사용하지 않는 코드로 확인한 함수 목록이 포함되어 있습니다. 이 파일에는 최적화 힌트에 연관된 내용만 들어있습니다. 포함된 힌트는 컴파일러에서 무시됩니다. 그렇기 때문에 안전한 최적화가 됩니다.

자세한 내용은 링커 피드백을 참조하십시오.

Note

사용하지 않는 함수를 제거하는 데에는 --split_sections 옵션(이전의 -zo)보다 링커 피드백을 사용하는 것이 좋습니다. 링커 피드백은 모든 섹션을 분할하는 오버헤드를 방지하여 더 작은 코드를 생성하기 때문입니다.

--fpmode model

부동 소수점 규칙을 지정하고 라이브러리 특성 및 부동 소수점 최적화를 설정합니다. model은 다음 중 하나일 수 있습니다.

ieee_full

IEEE 표준이 보장하는 모든 기능, 작업 및 표현이 단정밀도와 배정밀도로 제공됩니다. 런타임에 작동 모드를 동적으로 선택할 수 있습니다.

다음과 같은 심볼을 정의합니다.

__FP_IEEE
__FP_FENV_EXCEPTIONS
__FP_FENV_ROUNDING
__FP_INEXACT_EXCEPTION
ieee_fixed

가장 가까운 수로 반올림되며 부정확한 예외가 발생하지 않는 IEEE 표준입니다.

다음과 같은 심볼을 정의합니다.

__FP_IEEE
__FP_FENV_EXCEPTIONS
ieee_no_fenv

가장 가까운 수로 반올림되며 예외가 발생하지 않는 IEEE 표준입니다. 이 모드는 상태를 저장하지 않으며 Java 부동 소수점 산술 모델과 호환됩니다.

__FP_IEEE 심볼을 정의합니다.

std

0으로 플러시되는 비정규 IEEE 유한 값으로, 가장 가까운 수로 반올림되며 예외가 발생하지 않습니다. 표준 C 및 C++과 호환되며, 기본 옵션입니다.

기본 유한 값은 IEEE 표준에서 예측한 값입니다. 그러나

  • IEEE 모델에서 정의한 모든 환경에서 NaNs 및 무한 값이 생성되지 않을 수 있습니다. 또한 생성되는 경우 동일한 부호를 갖지 않을 수 있습니다.

  • 0의 부호는 IEEE 모델에서 예측하는 것과 다를 수 있습니다.

fast

정확도가 조금 낮아지는 반면 성능을 크게 향상시킬 수 있는 보다 적극적인 부동 소수점 최적화를 수행합니다. 이 옵션은 __FP_FAST 심볼을 정의합니다.

이 옵션으로 인해 ISO C 또는 C++ 표준과 완전히 호환되지 않는 동작이 발생합니다. 그렇지만, 강력한 수치 제어 부동 소수점 프로그램은 올바로 작동합니다.

다음과 같이 변환이 여러 번 수행될 수 있습니다.

  • 모든 부동 소수점 인수를 정확히 단정밀도 값으로 나타낼 수 있는 경우 배정밀도 수학 함수가 단정밀도 수학 함수로 변환될 수 있으며 그 결과 단정밀도 값이 바로 변환됩니다.

    선택한 라이브러리에 단정밀도 동등 함수가 포함되는 경우, 예를 들어 선택한 라이브러리가 rvct 또는 aeabi_glibc인 경우에만 이 변환이 수행됩니다(자세한 내용은 단일 최적화 옵션에서 --library_interface 참조).

    예를 들면 다음과 같습니다.

    float f(float a) { return sqrt(a); }
    

    위 옵션은 다음으로 변환됩니다.

    float f(float a) { return sqrtf(a); }.
    
  • 단정밀도로 좁혀진 배정밀도 부동 소수점 식은 단정밀도로 계산되는 것이 유용한 경우에 이렇게 계산됩니다. 예를 들어 float y = (float)(x + 1.0)float y = (float)x + 1.0f로 계산됩니다.

  • 부동 소수점 상수로 나누기는 반대로 곱하기로 바뀝니다. 예를 들어 x / 3.0x * (1.0 / 3.0)으로 계산됩니다.

  • 수학 함수가 호출된 후에는 errno의 값이 ISO C 또는 C++ 표준과 호환되지 않을 수 있습니다. 그러면 컴파일러에서 sqrt() 또는 sqrtf()를 호출하는 대신 VFP 제곱근 명령어를 인라인할 수 있습니다.

--multifile

컴파일러가 각 개별 파일 대신 지정된 모든 파일에서 최적화를 수행할 수 있습니다. 지정한 파일이 단일 오브젝트 파일로 컴파일됩니다. --multifile을 지정하면 컴파일할 때 메모리가 많이 필요합니다. 명령 행에 지정할 수 있는 파일 수에 제한은 없지만 소스 파일의 실질적인 제한은 10개입니다.

최적화 수준 -O3에 대해 기본적으로 --multifile이 사용됩니다.

multifile 컴파일에 대한 자세한 내용은 multifile 컴파일을 참조하십시오.

--vfe --no_vfe

C++ 모드에서 사용하지 않는 가상 함수 제거(VFE)를 사용하거나 사용하지 않습니다. RVCT v2.1 이전의 컴파일러로 컴파일된 레거시 오브젝트 파일에 VFE 정보가 없는 경우를 제외하고 --vfe가 기본값입니다.

VFE를 사용하면 컴파일러에서 접두사 .arm_vfe_가 지정된 특수 섹션에 정보를 배치합니다. 이러한 섹션은 나머지 코드에서 참조하지 않기 때문에 VFE에서 인식하지 않는 링커에 전혀 영향을 주지 않습니다. 그러므로 실행 파일 크기가 증가되지 않습니다. 그러나 오브젝트 파일의 크기는 증가됩니다. 크기 변경이 문제가 되는 경우 --no_vfe를 지정하십시오.

VFE 및 관련 링커 옵션에 대한 자세한 내용은 RealView Compilation Tools 버전 3.0 링커 및 유틸리티 설명서를 참조하십시오. 또한 순수 가상 함수에 대한 자세한 내용은 순수 가상 함수의 호출을 참조하십시오.

단일 최적화 옵션

이 장에서는 컴파일러 최적화를 개별적으로 제어하는 방법에 대해 설명합니다.

--autoinline --no_autoinline

자동 인라인을 사용하거나 사용하지 않습니다. --no_autoinline은 최적화 수준 -O0-O1의 기본값이고 --autoinline은 최적화 수준 -O2-O3의 기본값입니다(여러 최적화 옵션 참조).

컴파일러는 인라인을 설정해야 하는 함수에 자동으로 인라인을 설정합니다. -Ospace-Otime 옵션은 컴파일러에서 자동으로 함수를 인라인하는 방법에 영향을 줍니다. -Otime을 선택하면 함수가 인라인될 가능성이 높아집니다.

--data_reorder --no_data_reorder

최상위 수준 데이터 항목(예: 전역)의 자동 순서 변경을 사용하거나 사용하지 않습니다. 데이터 항목 사이에서 불필요한 공백을 제거하여 가용 메모리 크기를 증가시킬 수 있습니다. 그러나 코드에서 컴파일러의 데이터 순서 지정에 대해 잘못된 가정을 만드는 경우 --data_reorder는 레거시 코드를 중단할 수 있습니다.

ISO C 표준에서는 데이터 순서를 보장하지 않으므로 사용되는 순서에 따라 변경되는 코드를 작성하지 않아야 합니다. 데이터 순서를 지정해야 하는 경우 데이터 항목을 구조로 배치하십시오.

--forceinline

이 인수를 사용하면 가능한 경우 컴파일러에서 __inline으로 표시된 해당 함수를 항상 인라인하려 합니다. 컴파일러에서는 함수의 특성에 상관없이 함수를 인라인하려 합니다. 그러나 인라인하는 것이 문제가 되는 경우(예: 재귀 함수와 같이 한 번만 인라인되는 경우) 함수를 인라인하지 않습니다.

특정 함수를 인라인하려면 __forceinline 함수 스토리지 클래스 한정자를 사용하십시오(함수 스토리지 클래스 한정자 참조).

--no_inline

함수를 인라인하지 않습니다(--inline 참조). 인라인 함수를 호출해도 인라인으로 확장되지 않습니다. 인라인 함수를 디버그하는 데 이 옵션을 지정할 수 있습니다.

함수가 선언된 인라인이면 라인 외부에서 공통 코드 섹션으로 컴파일됩니다. __forceinline으로 표시된 함수는 여전히 인라인으로 확장됩니다(함수 스토리지 클래스 한정자 참조).

--inline

컴파일러에서 함수를 인라인할 수 있도록 합니다. 이것이 기본값입니다.

컴파일러에서 다음과 같이 함수를 인라인합니다.

  • --no_autoinline 옵션을 지정하지 않는 경우 최적화 수준 -O2-O3에 대해 자동으로 인라인(여러 최적화 옵션 참조).

  • 함수가 인라인 함수로 한정된 경우. C의 경우 __inline 키워드로, C 및 C++의 경우 __forceinline 키워드로 또는 C++의 경우 inline 키워드로 한정됩니다. 그러면 모든 최적화 수준에 적용됩니다. 명시적으로 인라인 함수로 한정된 함수가 인라인될 가능성이 더 많습니다. 그러나 inline 한정자를 사용해도 함수가 항상 인라인되지는 않습니다. 자세한 내용은 함수 키워드를 참조하십시오. 또한 --forceinline의 설명을 참조하십시오.

-Ospace 또는 -Otime을 선택하는지 여부에 따라 컴파일러에서 함수를 인라인하는 조건을 변경합니다. 함수가 인라인될 가능성을 늘리려면 -Otime을 선택하십시오. 자세한 내용은 여러 최적화 옵션을 참조하십시오.

어떤 경우에는 해당 코드를 더 이상 사용하지 않더라도 인라인된 함수의 라인 외부 복사본이 오브젝트나 이미지에 남을 수 있습니다. 링커 피드백을 사용하여 사용하지 않는 코드 조각을 검색하고 제거할 수 있습니다. 자세한 내용은 링커 피드백을 참조하십시오.

Note

인라인 함수에서 브레이크포인트를 설정하면 ARM 디버거가 해당 함수의 인라인된 각 인스턴스에 브레이크포인트를 설정하려고 시도합니다. Multi-ICE® RealView ICE 또는 기타 하드웨어를 사용하여 ROM에서 이미지를 디버그하고 있으며 인라인 인스턴스 수가 사용 가능한 하드웨어 브레이크포인트 수보다 많은 경우 디버거에서 추가 브레이크포인트를 설정할 수 없으며 오류를 보고합니다.

--lower_ropi --no_lower_ropi

ROPI 모드에서 덜 제한적인 C를 사용하거나 사용하지 않습니다. /ropi 옵션에 대한 자세한 내용은 위치 독립 한정자를 참조하십시오.

Note

--lower_ropi를 지정하여 컴파일하면 C++ 생성자 메커니즘으로 런타임에 정적 초기화를 수행하며 C에 대해서도 수행합니다. 그러면 ROPI 코드에서도 이런 정적 초기화를 사용할 수 있습니다.

--lower_rwpi --no_lower_rwpi

RWPI 모드에서 덜 제한적인 C와 C++를 사용하거나 사용하지 않습니다. --lower_rwpi는 기본값입니다. /rwpi 옵션에 대한 자세한 내용은 위치 독립 한정자를 참조하십시오.

Note

--lower_rwpi를 지정하여 컴파일하는 경우 런타임에 C++ 생성자 메커니즘에서 정적 초기화를 수행하며 C에 대해서도 수행합니다. 그러면 RWPI 코드에서도 이런 정적 초기화를 사용할 수 있습니다.

--split_ldm

기본적으로 컴파일러는 다음과 같이 LDMSTM 명령어에 대해 레지스터를 사용합니다.

  • ARM 명령어의 경우 16

  • 32비트 Thumb-2 명령어의 경우 15

  • 16비트 Thumb-2 명령어의 경우 8

--split_ldm 옵션은 필요한 위치에서 LDMSTM 명령어를 둘 이상의 LDM 또는 STM 명령어로 분할하여 전송되는 최대 레지스터 수를 줄이도록 컴파일러에 지시합니다.

  • 모든 STM 및 PC를 로드하지 않는 LDM의 경우 5

  • PC를 로드하는 LDM의 경우 4

기본적으로 인라인 어셈블러 LDMSTM 명령어는 분할됩니다. 그러나 이후에 컴파일러가 각각의 명령어를 LDM이나 STM으로 다시 조합할 수 있습니다(자세한 내용은 명령어 확장 참조).

--split_ldm 옵션을 지정하면 다음과 같은 결과가 작성됩니다.

  • 다음과 같은 ARM 시스템에서 인터럽트 대기 시간을 줄일 수 있습니다.

    • 캐시 또는 작성 버퍼가 없는 시스템(예: 캐시가 없는 ARM7TDMI)

    • 대기 상태가 0인 32비트 메모리를 사용하는 시스템

    Note

    --split_ldm을 사용하면 코드 크기가 늘어나고 성능은 약간 저하됩니다.

  • VFP FLDM 또는 FSTM 명령어를 분할하지 않습니다.

--split_ldm으로 작성하는 경우 혜택을 얻지 못하는 시스템도 있습니다.

  • 캐시된 시스템 또는 작성 버퍼가 있는 프로세서의 경우 별다른 이점이 없습니다.

  • 메모리 대기 상태가 0이 아닌 시스템 또는 주변 장치가 느린 시스템의 경우 이점이 없습니다. 이런 시스템의 인터럽트 대기 시간은 가장 느린 메모리 또는 주변 장치 액세스에 필요한 주기 수에 따라 결정됩니다. 일반적으로 이것은 multi 레지스터 전송으로 발생한 대기 시간보다 훨씬 깁니다.

--library_interface=lib

컴파일러 출력을 RVCT 라이브러리 또는 AEABI 호환 라이브러리에서 사용하도록 지정합니다. lib는 다음 중 하나일 수 있습니다.

rvct

컴파일러 출력을 RVCT 런타임 라이브러리에서 사용하도록 지정합니다. 링크할 때 전체 범위의 컴파일러 최적화를 이용하려면 이 옵션을 지정하십시오. 이것이 기본값입니다.

aeabi_clib

컴파일러 출력을 AEABI 호환 C 라이브러리에서 사용하도록 지정합니다.

aeabi_glibc

컴파일러 출력을 AEABI 호환 버전의 GNU C 라이브러리에서 사용하도록 지정합니다.

ABI 호환, 타사, 라이브러리와 링크할 때 이 옵션을 지정하거나 코드에 대체 함수를 포함할 위치, 예를 들어 임베디드 운영 체제를 사용하는 위치에 이 옵션을 지정하십시오. 이 경우 printf 또는 scanf와 같은 함수를 다시 구현하려는 경우 컴파일러 변형을 사용하지 않도록 이 옵션을 지정하십시오. 이 옵션을 지정하면 컴파일러에서 최적화된 함수를 호출하지 않습니다. 자세한 내용은 ABI for the ARM Architecture 규격 준수를 참조하십시오.

--split_sections

소스 파일에 있는 각 함수에 대해 ELF 섹션을 하나씩 생성합니다. 출력 섹션에는 섹션을 생성하는 함수의 이름에 접두사 i.가 추가된 형태로 이름이 지정됩니다. 예를 들면 다음과 같습니다.

int f(int x) { return x+1; }

--split_sections를 지정하여 컴파일하면 다음 결과가 작성됩니다.

        AREA ||i.f||, CODE, READONLY
f PROC
        ADD      r0,r0,#1
        MOV      pc,lr

이 옵션을 지정하면 함수 간에 주소, 데이터 및 문자열 리터럴을 공유할 가능성이 줄어들기 때문에 코드 크기가 약간(대개 몇 퍼센트 정도) 더 커질 수 있습니다.

Note

사용하지 않는 함수를 제거하려면 이 옵션보다는 링커 피드백 최적화를 사용하는 것이 좋습니다. 링커 피드백은 모든 섹션을 분할하는 오버헤드를 방지하여 더 작은 코드를 생성하기 때문입니다. 자세한 내용은 링커 피드백을 참조하십시오.

심볼 제어

이 장에서는 심볼 표시 타입을 제어하는 방법에 대해 설명합니다.

--export_defs_implicitly

동적 심볼을 내보내는 방법을 제어할 수 있습니다. 프로토타입이 __declspec(dllimport)으로 표시된 위치에 정의를 내보내려면 이 옵션을 지정하십시오.

__declspec(dllimport)에 대한 자세한 내용은 스토리지 클래스 한정자를 참조하십시오.

--dllexport_all

DLL을 빌드할 때 심볼 표시 타입을 제어할 수 있습니다. 모든 extern 정의를 __declspec(dllexport)으로 표시하려면 이 옵션을 지정하십시오.

__declspec(dllexport)에 대한 자세한 내용은 스토리지 클래스 한정자를 참조하십시오.

--no_hide_all

SVr4 공유 오브젝트를 빌드할 때 심볼 표시 타입을 제어할 수 있습니다. extern 정의를 모두 __declspec(dllexport)으로 표시하고 정의되지 않은 참조를 모두 가져오려면 이 옵션을 지정하십시오.

__declspec(dllexport)에 대한 자세한 내용은 스토리지 클래스 한정자를 참조하십시오.

포인터 정렬 옵션 설정

이 옵션을 지정하여 포인터 정렬을 제어할 수 있습니다.

--pointer_alignment=num

정렬되지 않은 필요한 포인터 지원을 지정합니다. 여기서 num은 다음 중 하나입니다.

1

포인터를 통한 액세스를 1바이트 정렬 또는 정렬되지 않은 것으로 처리합니다.

2

포인터를 통한 액세스를 2바이트(하프워드) 정렬로 처리합니다.

4

포인터를 통한 액세스를 4바이트(워드) 정렬로 처리합니다

8

포인터를 통한 액세스를 기본 정렬(더블워드 정렬)로 처리합니다.

비정렬 포인터는 정렬되지 않은 액세스를 지원하는 CPU에서도 코드 크기를 증가시킬 수 있습니다. 이는 로드 및 저장 명령어의 하위 세트만 정렬되지 않은 액세스 지원을 활용할 수 있기 때문입니다. 컴파일러에서는 하드웨어 부동 소수점 로드 및 저장을 비롯하여 정렬되지 않은 메모리 오브젝트에서 직접 multi 워드 전송이나 보조 프로세서 메모리 전송을 사용할 수 없습니다.

Note

  • 정렬되지 않은 액세스를 지원하지 않는 CPU를 컴파일할 때 코드 크기가 상당히 증가될 수 있습니다.

  • 정렬되지 않은 포인터 모드는 메모리의 오브젝트 배치와 구조체의 레이아웃 및 패딩에는 영향을 주지 않습니다.

이 옵션은 정렬할 필요가 없는 아키텍처에 대해 작성된 소스 코드의 포팅을 지원합니다. __packed 한정자를 사용하면 생성된 코드의 품질에 영향을 덜 주는 정렬되지 않은 데이터에 대한 액세스를 더 세세하게 제어할 수 있습니다. __packed 한정자에 대한 자세한 내용은 타입 한정자를 참조하십시오.

정렬 옵션 설정

이 옵션을 지정하여 메모리 정렬을 제어할 수 있습니다.

--unaligned_access --no_unaligned_access

ARMv6(예: --cpu ARM1136J-S) 또는 ARMv6 아키텍처(즉, --cpu 6)를 지원하는 프로세서를 지정하면 컴파일러에서 U 비트가 설정된 것으로 가정하고 정렬되지 않은 액세스 지원을 사용하여, 워드로 정렬되지 않은 주소에서 로드할 LDR 명령어를 사용하거나 워드로 정렬되지 않은 주소에 저장할 STR 명령어를 사용하는 방식으로, 패킹된 구조체에 대한 액세스를 가속화합니다. 즉, 컴파일러에서 정렬되지 않은 워드 및 하프워드 액세스를 생성하고 정렬되지 않은 액세스를 지원하는 라이브러리를 선택할 수 있습니다. __packed를 지정하여 명시적으로 한정시키지 않은 경우에는 구조체가 패킹되지 않은 상태로 유지됩니다(타입 한정자 참조).

그러므로 ARMv6용으로 컴파일된 코드는 정렬되지 않은 지원을 설정한 경우에만 올바르게 실행할 수 있습니다. 이렇게 하려면 초기화 코드에 CP15 레지스터 1의 U 비트(비트 22)를 설정해야 합니다. UBITINIT 입력을 코어 HIGH에 입력하여 하드웨어에서도 실행할 수 있습니다.

--no_unaligned_access 옵션을 지정하여 ARMv6 프로세서에서 정렬되지 않은 액세스의 생성을 사용하지 않습니다.

Note

--no_unaligned_access 옵션은 --memaccess -UL41을 대체합니다. --memaccess 옵션은 향후 제공되지 않으며 이후 릴리스에서 제거됩니다.

--min_array_alignment=option

배열의 최소 정렬을 지정합니다. 여기서 option은 다음 중 하나입니다.

1

1바이트 정렬 또는 정렬되지 않음

2

2바이트(하프워드) 정렬

4

4바이트(워드) 정렬

8

8바이트(더블워드) 정렬

예를 들어 --min_array_alignment=8로 다음 코드를 컴파일하면 주석에 설명된 정렬이 제공됩니다.

char arr_c1[1];      // alignment == 8
char c1;             // alignment == 1
char arr_c2[3];      // alignment == 8
char arr_c3[10];     // alignment == 8

struct st {
    int i1;
} c;                 // alignment == 4

char c2;             // alignment == 1

__align(n) 스토리지 클래스 한정자에 대한 자세한 내용은 스토리지 클래스 한정자를 참조하십시오.

구현 정보 제어

이 옵션을 지정하여 구현 정보를 제어할 수 있습니다.

--enum_is_int

모든 열거 타입의 크기를 최소 4바이트로 설정합니다. 이 옵션은 기본적으로 사용되지 않으며 모든 열거자의 값을 포함할 수 있는 최소 데이터 타입이 사용됩니다.

Note

일반적인 용도로는 --enum_is_int 옵션을 지정하지 않는 것이 좋으며 ISO 호환 소스에는 필요하지 않습니다. 이 옵션으로 컴파일한 코드는 ABI for the ARM Architecture(기본 표준)[BSABI] 규격을 준수하며 잘못 사용하면 런타임에 오류가 발생할 수 있습니다. 이 옵션은 C++ 라이브러리에서 지원되지 않습니다.

--dollar --no_dollar

식별자에 달러 기호($)를 사용할 수 있습니다. 기본값은 --dollar입니다(--strict 모드인 경우는 제외).

--alternative_tokens --no_alternative_tokens

대체 토큰 인식을 사용하거나 사용하지 않습니다. C 및 C++에서 이중음자의 인식을 제어하고 C++에서 andbitand 같은 연산자 키워드의 인식을 제어합니다. 이중음자에 대한 자세한 내용은 The Design and Evolution of C++ 또는 C++ 프로그래밍 언어에 대한 다른 설명서를 참조하십시오. 기본 동작은 --alternative_tokens입니다.

--multibyte_chars --no_multibyte_chars

주석, 문자열 리터럴 및 문자 상수에서 multibyte 문자 시퀀스의 처리를 사용하거나 사용하지 않습니다. multibyte 인코딩은 일본어 Shift-JIS(Shift-Japanese Industrial Standard)와 같은 문자 세트에서 사용됩니다. 기본값은 --no_multibyte_chars입니다.

--locale lang_country

소스 파일의 기본 로케일을 lang_country에서 지정한 로케일로 바꾸려면 이 옵션을 --multibyte_chars와 같이 지정하십시오.

예를 들어 영어 기반 Windows 워크스테이션에서 일본어 소스 파일을 컴파일하려면 다음 명령을 실행합니다.

--multibyte_chars --locale japanese

유닉스 워크스테이션에서는 다음 명령을 실행합니다.

--multibyte_chars --locale ja_JP

로케일 이름은 호스트 플랫폼에 따라 대소문자를 구분할 수 있습니다.

허용되는 로케일 설정은 호스트 플랫폼에 의해 결정됩니다.

호스트 플랫폼에 필요한 로케일 지원을 설치했는지 확인하십시오.

--message_locale lang_country --message_locale lang_country.codepage

오류 및 경고 메시지를 표시할 기본 언어를 lang_country 또는 lang_country.codepage에서 지정한 언어로 바꾸려면 이 옵션을 지정하십시오.

예를 들어 한국어로 메시지를 표시하려면 다음 명령을 실행합니다.

--message_locale ko_KR

로케일 이름은 호스트 플랫폼에 따라 대소문자를 구분할 수 있습니다.

호스트 플랫폼에 필요한 로케일 지원을 설치했는지 확인하십시오.

허용되는 언어는 호스트 플랫폼에 따라 다릅니다. 이번 릴리스의 RVCT에서는 다음 설정이 지원됩니다.

  • en_US(기본값)

  • zh_CN

  • ko_KR

  • ja_JP

코드페이지 및 해당 의미를 지정하는 기능은 호스트 플랫폼에 따라 다릅니다.

지원하지 않는 설정을 지정하면 컴파일러에서 자동으로 무시하고 해당 환경의 기본값을 사용합니다.

--loose_implicit_cast

0이 아닌 intpointer로 캐스트하는 암시적 캐스트처럼 잘못된 암시적 캐스트를 수정합니다. 예를 들면 다음과 같습니다.

int *p = 0x8000;

이 옵션을 지정하지 않으면 컴파일러에서 다음을 보고합니다.

오류:  #144: "int" 타입 값을 "int *" 타입 초기화에 사용할 수 없습니다.

이 옵션을 지정하면 컴파일러에서 다음 경고를 생성합니다. 이 메시지는 표시하지 않을 수 있습니다(진단 메시지 표시 안 함 참조).

경고:  #152-D: 0이 아닌 정수를 포인터로 변환했습니다.
--restrict --no_restrict

C99 restrict 키워드를 사용하거나 사용하지 않습니다. 기본값은 --no_restrict입니다.

restrict 키워드에 대한 자세한 내용은 restrict를 참조하십시오.

--signed_bitfields --unsigned_bitfields

비트 필드를 signed 형식으로 지정합니다. 기본값은 --unsigned_bitfields입니다.

Note

ARM에서 비트 필드를 기본적으로 unsigned로 지정해야 하는 AAPCS 요구 사항이 바뀌었습니다.

--signed_chars --unsigned_chars

char 타입을 signed 또는 unsigned로 지정합니다. 기본값은 --unsigned_chars입니다.

char에 부호가 있으면 컴파일러에서 매크로 __FEATURE_SIGNED_CHAR를 정의합니다.

--unsigned_chars의 경우 음수가 할당된 모든 char에 대해 다음 경고가 표시됩니다.

 경고:  #68-D: 정수 변환으로 부호가 변경되었습니다.

Note

일반적인 용도로는 --signed_chars 옵션을 지정하지 않는 것이 좋으며 ISO 호환 소스에는 필요하지 않습니다. 이 옵션을 지정하여 컴파일한 코드는 ABI for the ARM Architecture(기본 표준)[BSABI] 규격을 준수하지 않으며 잘못된 사용으로 런타임에 오류가 발생할 수 있습니다. 이 옵션은 C++ 라이브러리에서 지원되지 않습니다.

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