diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -194,6 +194,14 @@ Builder.defineMacro("__LP64__"); } + std::string CodeModel = getTargetOpts().CodeModel; + if (CodeModel == "default") + CodeModel = "small"; + for (auto& c : CodeModel) { + c = toupper(c); + } + Builder.defineMacro("__AARCH64_CMODEL_" + CodeModel + "__"); + // ACLE predefines. Many can only have one possible value on v8 AArch64. Builder.defineMacro("__ARM_ACLE", "200"); Builder.defineMacro("__ARM_ARCH", "8"); diff --git a/clang/test/Preprocessor/init.c b/clang/test/Preprocessor/init.c --- a/clang/test/Preprocessor/init.c +++ b/clang/test/Preprocessor/init.c @@ -285,6 +285,7 @@ // AARCH64-NOT:#define __AARCH64EB__ 1 // AARCH64:#define __AARCH64EL__ 1 // AARCH64-NOT:#define __AARCH_BIG_ENDIAN 1 +// AARCH64:#define __AARCH64_CMODEL_SMALL__ 1 // AARCH64:#define __ARM_64BIT_STATE 1 // AARCH64:#define __ARM_ARCH 8 // AARCH64:#define __ARM_ARCH_ISA_A64 1