RISC-V 架构适配知识库
  • 睿迁工具集
  • RVSmartPorting
  • 简体中文
  • English (US)
在 Gitee 上查看
  • 睿迁工具集
  • RVSmartPorting
  • 简体中文
  • English (US)
在 Gitee 上查看
  • 简介
    • 贡献规范
  • 入门
    • 内存一致性模型
    • 硬件开发板差异
    • 指令集模块
  • 通用调整
    • 检查项目对多架构的支持性
    • 文件结构调整
    • 目录结构调整
    • 测试用例调整
  • C/C++ 程序
    • 内联汇编
    • 宏定义与判断
    • 移位运算中的整形常数
    • Intrinsic 函数
    • 多版本函数
    • 系统调用
  • 汇编程序
  • 编译配置文件
    • rpmbuild
    • Makefile
    • CMake
    • Autoconf
    • QMake
    • 其它
  • 其它编程语言
    • Rust
    • Go
    • Python
    • 其它语言
  • 辅助工具集
    • 目标代码定位工具
    • 汇编指令翻译工具

宏定义与判断

主流的 C/C++ 编译器会预定义一些特定的宏,以帮助开发者检查和判断程序的运行环境,包括但不限于 所使用的编译器、目标操作系统、硬件架构,以及 所需的运行库 等。根据编译目标环境的不同, 编译器会自动启用或禁用这些预定义宏,从而令开发者在源代码中使用的 #ifdef 或 #if 等宏判断语句在预处理的过程中进入不同的分支。

C/C++ 源文件中,以宏作为判断条件的宏分支语句主要包括以下形式:

#ifdef __ARCH
#ifndef __ARCH__
#elifdef __ARCH    // Since C++ 23
#elifndef __ARCH__ // Since C++ 23
#if defined(__ARCH)
#elif defined(__ARCH__)
#if __ARCH
#elif __ARCH__

其中,若宏分支语句的条件或分支块中出现了以下情形的宏,则可以认为它们属于 架构相关宏:

  • 编译器预定义的 硬件架构相关宏,通常有 __架构名 和 __架构名__ 两种形式
  • 在编译器预定义的 硬件架构相关宏 作为条件的宏分支语句下,通过 #define 语句自定义的宏

其中,编译器预定义的 硬件架构相关宏 通常可在 附录:主流编译器提供的硬件架构相关预定义宏 所提供的清单中找到。 后者则需检查所有使用编译器预定义的 硬件架构相关宏 作为条件的宏分支语句块, 追踪这些语句块下自定义宏的 定义 过程,以及在源代码上下文中的 使用 过程。

架构相关宏

以下代码片段中,展示的是架构相关宏判定标准。 只要分支外部层级结构中出现了任一 架构相关宏, 则分支内部定义的所有宏都认为是 架构相关宏。

#if defined(__CUSTOM)                   // 非架构相关宏
    #define CUSTOM_MACRO                // 非架构相关宏
    #ifdef __mips__                     // 编译器预定义的架构相关宏
        #define CUSTOM_ARCH_MACRO_1     // 自定义的架构相关宏
    #endif
#endif
#ifdef __x86_64__                       // 编译器预定义的架构相关宏
    #define CUSTOM_ARCH_MACRO_1         // 自定义的架构相关宏
    #if defined(__xxx_CPU_FEATURE__)    // 非架构相关宏
        #define CUSTOM_ARCH_MACRO_2     // 自定义的架构相关宏
    #endif
#elifdef __arm__                        // 编译器预定义的架构相关宏
    #ifndef __xxx_LIB                   // 非架构相关宏
        #define NOT_USE_xxx_LIB         // 自定义的架构相关宏
    #endif
#else
    #define UNK_ARCH                    // 自定义的架构相关宏
#endif

附录:主流编译器提供的硬件架构相关预定义宏

Alpha

宏类型宏名称宏描述
标识符__alpha__由 GNU C 定义
版本号__alpha_ev{V}__ 由 GNU C 定义,其中 {V} 表示版本号。参见 示例
标识符__alpha
__ALPHA
__Alpha_AXP
由 DEC C 定义
标识符_M_ALPHA由 Visual Studio 定义

__alpha_ev{V}__ 宏示例

CPU宏名称
Alpha EV4__alpha_ev4__
Alpha EV5__alpha_ev5__
Alpha EV6__alpha_ev6__

AMD64

宏类型宏名称宏描述
标识符__amd64__
__amd64
__x86_64__
__x86_64
由 GNU C 和 Sun Studio 定义
标识符_M_X64
_M_AMD64
由 Visual Studio 定义

提示

若要检查目标平台是否为 32 位,可检查是否使用了 ILP32 数据模型。

ARM

宏类型宏名称宏描述
标识符__arm__
由 GNU C 和 ARM 定义
标识符__thumb__
由 GNU C 和 ARM (Thumb 模式) 定义
版本号__ARM_ARCH_{V}__
由 GNU C 定义
版本号__TARGET_ARCH_ARM = V
__TARGET_ARCH_THUMB = V
由 ARM 定义,架构版本与该宏值 V 的对应关系参见 此表
版本号__TARGET_ARCH_{V}{R}

由 ARM 定义,其中 {V} 表示 ARM 架构主版本,
{R} 表示修订版本(通常为一些代表指令集特性的字母

具体值与编译参数 --cpu=NAME 直接相关, 参见 此表

版本号__TARGET_CPU_{MODEL}

由 ARM 定义,其中 {MODEL} 表示目标 ARM CPU 型号

具体值与编译参数 --cpu=NAME 直接相关,命名规则为:

  • 字母全部大写
  • 若出现 - 符号,将被转换为 _ 下划线

具体示例参见 此表

标识符_ARM
由 ImageCraft C 定义
标识符__arm
由 Diab 定义
标识符_M_ARMT
由 Visual Studio (Thumb 模式) 定义
版本号_M_ARM = V
由 Visual Studio 定义,其中 V 为 ARM 架构主版本号

__TARGET_ARCH_ARM/THUMB 宏与 ARM 架构版本对应关系

ARM 架构版本__TARGET_ARCH_ARM__TARGET_ARCH_THUMB
v440
v4T41
v5T, v5TE, v5TEJ52
v6, v6K, v6Z63
v6T264
v6-M, v6S-M03
v7-A, v7-R74
v7-M, v7E-M04
v8-A, v8-R85
v8-M, v8E-M05
v9-A96

__TARGET_ARCH_XX 宏与 --cpu 编译参数对应关系

--cpu 参数对应家族对应 __TARGET_ARCH_XX 宏名称描述
4__TARGET_ARCH_4ARMv4 without Thumb
4T__TARGET_ARCH_4TARMv4 with Thumb
5T__TARGET_ARCH_5TARMv5 with Thumb and interworking
5TE__TARGET_ARCH_5TEARMv5 with Thumb, interworking, DSP multiply, and double-word instructions
5TEJ__TARGET_ARCH_5TEJARMv5 with Thumb, interworking, DSP multiply, double-word instructions, and Jazelle extensions
6__TARGET_ARCH_6ARMv6 with Thumb, interworking, DSP multiply, double-word instructions, unaligned and mixed-endian support, Jazelle, and media extensions.
6-M__TARGET_ARCH_6_MARMv6 microcontroller profile with Thumb only, plus processor state instructions.
6S-M__TARGET_ARCH_6S_MARMv6 microcontroller profile with Thumb only, plus processor state instructions and OS extensions.
6K__TARGET_ARCH_6KARMv6 with SMP extensions.
6T2__TARGET_ARCH_6T2ARMv6 with Thumb (Thumb-2 technology).
6Z__TARGET_ARCH_6ZARMv6 with Security Extensions.
7__TARGET_ARCH_7ARMv7 with Thumb (Thumb-2 technology) only, and without hardware divide.
7-A__TARGET_ARCH_7_AARMv7 application profile.
7-A.security__TARGET_ARCH_7_AARMv7-A architecture profile with the SMC instruction (formerly SMI).
7-R__TARGET_ARCH_7_RARMv7 real-time profile.
7-M__TARGET_ARCH_7_MARMv7 microcontroller profile.
7E-M__TARGET_ARCH_7E_MARMv7-M architecture profile with DSP extension.
8-A.32__TARGET_ARCH_8_AARMv8, AArch32 state
8-A.32.crypto__TARGET_ARCH_8_AARMv8, AArch32 state with cryptographic instructions
8-A.32.no_neon__TARGET_ARCH_8_AARMv8, AArch32 state without Advanced SIMD instructions
8-A.64__TARGET_ARCH_8_AARMv8, AArch64 state
8-A.64.crypto__TARGET_ARCH_8_AARMv8, AArch64 state with cryptographic instructions
8-A.64.no_neon__TARGET_ARCH_8_AARMv8, AArch64 state without Advanced SIMD instructions
9-A__TARGET_ARCH_9_AARMv9

__TARGET_CPU_XX 宏示例

ARM CPU 型号__TARGET_CPU_XX 宏名称
ARM7TM__TARGET_CPU_ARM7TM
Cortex-R4__TARGET_CPU_CORTEX_R4
Neoverse-N1__TARGET_CPU_NEOVERSE_N1

ARM64

宏类型宏名称宏描述
标识符__aarch64__
由 GNU C 定义

Intel x86

宏类型宏名称宏描述
标识符i386
__i386__
由 GNU C 定义
版本号__i386__
__i486__
__i586__
__i686__
由 GNU C 定义
标识符__i386
由 GNU C、Sun Studio 和 Stratus VOS C 定义
标识符__IA32__
由 Stratus VOS C 定义
标识符__X86__
由 Watcom C/C++ 定义
标识符_X86_
由 MinGW32 定义
标识符__THW_INTEL__
由 XL C/C++ 定义
版本号__I86__ = V
由 Digital Mars 定义,其中 V 为表示指令集版本号的整数,范围为 [3, 6],具体值参见 示例
标识符__INTEL__
由 CodeWarrior 定义
标识符__386
由 Diab 定义
标识符_M_I86
由 Visual Studio、Digital Mars 及 Watcom C/C++ 定义,仅在 16 位架构中定义
标识符_M_IX86 = {V}00
由 Visual Studio、Intel C/C++、Digital Mars 及 Watcom C/C++ 定义,具体值参见 示例
仅在 32 位架构中定义,其中 {V} 为表示指令集版本号的整数,范围为 [3, 6]

提示

Watcom C/C++ 在 16 位和 32 位架构下,均定义了宏 _M_IX86 宏。在这种情况下,可通过 __386__ 及 _M_I386 宏用于确定是否为 32 位架构。

_M_IX86 及 __I86__ 宏示例

CPU 型号_M_IX86 宏名称及具体值__I86__ 宏具体值
80386_M_I386 = 3003
80486_M_I486 = 4004
Pentium_M_I586 = 5005
Pentium Pro/II_M_I686 = 6006

RISC-V

宏类型宏名称宏描述
标识符__riscv
由 GNU C 定义

参考文献

  • Architecture - Pre-defined C/C++ Compiler Macros Wiki
  • Predefined Macros - ARM Compiler toolchain Compiler Reference Version 5.03
  • --cpu - ARM Compiler armasm Reference Guide Version 6.01
  • --cpu=name - ARM Compiler armlink User Guide Version 5.06
  • List of ARM processors - Wikipedia
编辑本页面
最后更新时间:
贡献者: LightningRS
Prev
内联汇编
Next
移位运算中的整形常数

本知识库采用 木兰开放作品许可协议 署名-相同方式共享 第1版 进行许可

版权所有 © 2025 RVSmartPorting. | 京ICP备20005262号 | beian京公网安备11010802043677号