[Lldb-commits] [lldb] 70b2f06 - Add ARMv8-M and ARMv8.1-M support for Darwin (#195184)
via lldb-commits
lldb-commits at lists.llvm.org
Thu Apr 30 20:03:03 PDT 2026
Author: Doug Gregor
Date: 2026-04-30T20:02:55-07:00
New Revision: 70b2f06ab493e29bb5dcc627bd016714dd21405f
URL: https://github.com/llvm/llvm-project/commit/70b2f06ab493e29bb5dcc627bd016714dd21405f
DIFF: https://github.com/llvm/llvm-project/commit/70b2f06ab493e29bb5dcc627bd016714dd21405f.diff
LOG: Add ARMv8-M and ARMv8.1-M support for Darwin (#195184)
Extend Mach-O reading/writing and Clang's driver with support for
ARMv8-M and ARMv8.1-M. Then, build libclang_rt for armv8m.main and
armv8.1m.main target triples.
Added:
Modified:
clang/lib/Driver/ToolChains/Darwin.cpp
clang/test/Driver/darwin-embedded.c
clang/test/Frontend/darwin-eabi.c
compiler-rt/cmake/Modules/CompilerRTDarwinUtils.cmake
lldb/include/lldb/Host/SafeMachO.h
lldb/include/lldb/Utility/ArchSpec.h
lldb/source/Utility/ArchSpec.cpp
lldb/tools/debugserver/source/DNB.cpp
llvm/include/llvm/BinaryFormat/MachO.h
llvm/include/llvm/TextAPI/Architecture.def
llvm/lib/BinaryFormat/MachO.cpp
llvm/lib/Object/MachOObjectFile.cpp
llvm/test/CodeGen/ARM/MachO-subtypes.ll
llvm/tools/llvm-objdump/MachODump.cpp
llvm/tools/llvm-readobj/MachODumper.cpp
llvm/unittests/BinaryFormat/MachOTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp
index 61b779c60b90f..6fd8583a57d0f 100644
--- a/clang/lib/Driver/ToolChains/Darwin.cpp
+++ b/clang/lib/Driver/ToolChains/Darwin.cpp
@@ -63,6 +63,7 @@ llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
.Cases({"arm", "armv4t", "armv5", "armv6", "armv6m"}, llvm::Triple::arm)
.Cases({"armv7", "armv7em", "armv7k", "armv7m"}, llvm::Triple::arm)
.Cases({"armv7s", "xscale"}, llvm::Triple::arm)
+ .Cases({"armv8m.base", "armv8m.main", "armv8.1m.main"}, llvm::Triple::arm)
.Cases({"arm64", "arm64e"}, llvm::Triple::aarch64)
.Case("arm64_32", llvm::Triple::aarch64_32)
.Case("r600", llvm::Triple::r600)
@@ -88,7 +89,10 @@ void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str,
if ((T.getOS() != llvm::Triple::Firmware) &&
(ArchKind == llvm::ARM::ArchKind::ARMV6M ||
ArchKind == llvm::ARM::ArchKind::ARMV7M ||
- ArchKind == llvm::ARM::ArchKind::ARMV7EM)) {
+ ArchKind == llvm::ARM::ArchKind::ARMV7EM ||
+ ArchKind == llvm::ARM::ArchKind::ARMV8MBaseline ||
+ ArchKind == llvm::ARM::ArchKind::ARMV8MMainline ||
+ ArchKind == llvm::ARM::ArchKind::ARMV8_1MMainline)) {
// Don't reject these -version-min= if we have the appropriate triple.
if (T.getOS() == llvm::Triple::IOS)
for (Arg *A : Args.filtered(options::OPT_mios_version_min_EQ))
@@ -1063,6 +1067,9 @@ static const char *ArmMachOArchName(StringRef Arch) {
.Cases({"armv7k", "armv7-k"}, "armv7k")
.Cases({"armv7m", "armv7-m"}, "armv7m")
.Cases({"armv7s", "armv7-s"}, "armv7s")
+ .Cases({"armv8-m.base", "armv8m.base"}, "armv8m.base")
+ .Cases({"armv8-m.main", "armv8m.main"}, "armv8m.main")
+ .Cases({"armv8.1-m.main", "armv8m.main"}, "armv8.1m.main")
.Default(nullptr);
}
@@ -2437,7 +2444,8 @@ inferDeploymentTargetFromArch(DerivedArgList &Args, const Darwin &Toolchain,
else if (MachOArchName == "armv7k" || MachOArchName == "arm64_32")
OSTy = llvm::Triple::WatchOS;
else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
- MachOArchName != "armv7em")
+ MachOArchName != "armv7em" && MachOArchName != "armv8m.base" &&
+ MachOArchName != "armv8m.main" && MachOArchName != "armv8.1m.main")
OSTy = llvm::Triple::MacOSX;
if (OSTy == llvm::Triple::UnknownOS)
return std::nullopt;
@@ -3267,6 +3275,12 @@ DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
DAL->AddJoinedArg(nullptr, MArch, "armv7m");
else if (Name == "armv7s")
DAL->AddJoinedArg(nullptr, MArch, "armv7s");
+ else if (Name == "armv8-m.base" || Name == "armv8m.base")
+ DAL->AddJoinedArg(nullptr, MArch, "armv8m.base");
+ else if (Name == "armv8-m.main" || Name == "armv8m.main")
+ DAL->AddJoinedArg(nullptr, MArch, "armv8m.main");
+ else if (Name == "armv8.1-m.main" || Name == "armv8.1m.main")
+ DAL->AddJoinedArg(nullptr, MArch, "armv8.1m.main");
}
return DAL;
diff --git a/clang/test/Driver/darwin-embedded.c b/clang/test/Driver/darwin-embedded.c
index beb8b195c42d1..471868c9d1971 100644
--- a/clang/test/Driver/darwin-embedded.c
+++ b/clang/test/Driver/darwin-embedded.c
@@ -7,6 +7,12 @@
// RUN: %clang -target x86_64-apple-darwin -arch armv7em -fPIC -mfloat-abi=softfp -resource-dir=%S/Inputs/resource_dir %s -### 2>> %t
// RUN: %clang -target x86_64-apple-none-macho -arch armv7 -mhard-float -resource-dir=%S/Inputs/resource_dir %s -### 2>> %t
// RUN: %clang -target x86_64-apple-none-macho -arch armv7 -msoft-float -fPIC -resource-dir=%S/Inputs/resource_dir %s -### 2>> %t
+// RUN: %clang -target x86_64-apple-darwin -arch armv8m.base -fPIC -mfloat-abi=hard -resource-dir=%S/Inputs/resource_dir %s -### 2>> %t
+// RUN: %clang -target x86_64-apple-darwin -arch armv8m.base -fPIC -mfloat-abi=softfp -resource-dir=%S/Inputs/resource_dir %s -### 2>> %t
+// RUN: %clang -target x86_64-apple-darwin -arch armv8m.main -fPIC -mfloat-abi=hard -resource-dir=%S/Inputs/resource_dir %s -### 2>> %t
+// RUN: %clang -target x86_64-apple-darwin -arch armv8m.main -fPIC -mfloat-abi=softfp -resource-dir=%S/Inputs/resource_dir %s -### 2>> %t
+// RUN: %clang -target x86_64-apple-darwin -arch armv8.1m.main -fPIC -mfloat-abi=hard -resource-dir=%S/Inputs/resource_dir %s -### 2>> %t
+// RUN: %clang -target x86_64-apple-darwin -arch armv8.1m.main -fPIC -mfloat-abi=softfp -resource-dir=%S/Inputs/resource_dir %s -### 2>> %t
// RUN: FileCheck %s < %t
@@ -59,3 +65,40 @@
// CHECK-NOT: warning: unknown platform
// CHECK: "-mfloat-abi" "soft"
// CHECK: libclang_rt.soft_pic.a
+
+// ARMv8(.1).m(base|main) has float
+// CHECK-LABEL: Target: armv8m.base
+// CHECK-NOT: warning: unknown platform
+// CHECK: "-mfloat-abi" "hard"
+// CHECK: libclang_rt.hard_pic.a
+
+// but the ABI can be overridden
+// CHECK-LABEL: Target: armv8m.base
+// CHECK-NOT: warning: unknown platform
+// CHECK: "-target-feature" "+soft-float-abi"
+// CHECK: "-mfloat-abi" "soft"
+// CHECK: libclang_rt.soft_pic.a
+
+// CHECK-LABEL: Target: armv8m.main
+// CHECK-NOT: warning: unknown platform
+// CHECK: "-mfloat-abi" "hard"
+// CHECK: libclang_rt.hard_pic.a
+
+// but the ABI can be overridden
+// CHECK-LABEL: Target: armv8m.main
+// CHECK-NOT: warning: unknown platform
+// CHECK: "-target-feature" "+soft-float-abi"
+// CHECK: "-mfloat-abi" "soft"
+// CHECK: libclang_rt.soft_pic.a
+
+// CHECK-LABEL: Target: armv8.1m.main
+// CHECK-NOT: warning: unknown platform
+// CHECK: "-mfloat-abi" "hard"
+// CHECK: libclang_rt.hard_pic.a
+
+// but the ABI can be overridden
+// CHECK-LABEL: Target: armv8.1m.main
+// CHECK-NOT: warning: unknown platform
+// CHECK: "-target-feature" "+soft-float-abi"
+// CHECK: "-mfloat-abi" "soft"
+// CHECK: libclang_rt.soft_pic.a
diff --git a/clang/test/Frontend/darwin-eabi.c b/clang/test/Frontend/darwin-eabi.c
index 9d62632891cbe..b94bf26e2853f 100644
--- a/clang/test/Frontend/darwin-eabi.c
+++ b/clang/test/Frontend/darwin-eabi.c
@@ -1,7 +1,11 @@
// RUN: %clang --target=armv6m-apple-darwin -dM -E %s | FileCheck %s
// RUN: %clang --target=armv7m-apple-darwin -dM -E %s | FileCheck %s
// RUN: %clang --target=armv7em-apple-darwin -dM -E %s | FileCheck %s
+// RUN: %clang --target=armv8m.base-apple-darwin -dM -E %s | FileCheck %s
+// RUN: %clang --target=armv8m.main-apple-darwin -dM -E %s | FileCheck %s
+// RUN: %clang --target=armv8.1m.main-apple-darwin -dM -E %s | FileCheck %s
// RUN: %clang_cc1 -triple thumbv7m-apple-unknown-macho -dM -E %s | FileCheck %s
+// RUN: %clang_cc1 -triple thumbv8m-apple-unknown-macho -dM -E %s | FileCheck %s
// CHECK-NOT: __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__
// CHECK-NOT: __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
diff --git a/compiler-rt/cmake/Modules/CompilerRTDarwinUtils.cmake b/compiler-rt/cmake/Modules/CompilerRTDarwinUtils.cmake
index ac127ded4be4d..2f4654e5efdcd 100644
--- a/compiler-rt/cmake/Modules/CompilerRTDarwinUtils.cmake
+++ b/compiler-rt/cmake/Modules/CompilerRTDarwinUtils.cmake
@@ -526,9 +526,9 @@ endmacro()
macro(darwin_add_embedded_builtin_libraries)
# this is a hacky opt-out. If you can't target both intel and arm
# architectures we bail here.
- set(DARWIN_SOFT_FLOAT_ARCHS armv6m armv7m armv7em armv7)
- set(DARWIN_HARD_FLOAT_ARCHS armv7em armv7)
- if(COMPILER_RT_SUPPORTED_ARCH MATCHES ".*armv.*")
+ set(DARWIN_SOFT_FLOAT_ARCHS armv6m armv7m armv7em armv7 armv8m.main armv8.1m.main)
+ set(DARWIN_HARD_FLOAT_ARCHS armv7em armv7 armv8m.main armv8.1m.main)
+ if(COMPILER_RT_SUPPORTED_ARCH MATCHES ".*arm.*")
list(FIND COMPILER_RT_SUPPORTED_ARCH i386 i386_idx)
if(i386_idx GREATER -1)
list(APPEND DARWIN_HARD_FLOAT_ARCHS i386)
@@ -553,7 +553,7 @@ macro(darwin_add_embedded_builtin_libraries)
set(PIC_FLAG -fPIC)
set(STATIC_FLAG -static)
- set(DARWIN_macho_embedded_ARCHS armv6m armv7m armv7em armv7 i386 x86_64)
+ set(DARWIN_macho_embedded_ARCHS armv6m armv7m armv7em armv7 armv8m.main armv8.1m.main i386 x86_64)
set(DARWIN_macho_embedded_LIBRARY_OUTPUT_DIR
${COMPILER_RT_OUTPUT_LIBRARY_DIR}/macho_embedded)
@@ -574,6 +574,8 @@ macro(darwin_add_embedded_builtin_libraries)
set(armv7m_FUNCTIONS ${common_FUNCTIONS} ${arm_FUNCTIONS} ${thumb2_FUNCTIONS})
set(armv7em_FUNCTIONS ${common_FUNCTIONS} ${arm_FUNCTIONS} ${thumb2_FUNCTIONS})
set(armv7_FUNCTIONS ${common_FUNCTIONS} ${arm_FUNCTIONS} ${thumb2_FUNCTIONS} ${thumb2_64_FUNCTIONS})
+ set(armv8m.main_FUNCTIONS ${common_FUNCTIONS} ${arm_FUNCTIONS} ${thumb2_FUNCTIONS} ${thumb2_64_FUNCTIONS})
+ set(armv8.1m.main_FUNCTIONS ${common_FUNCTIONS} ${arm_FUNCTIONS} ${thumb2_FUNCTIONS} ${thumb2_64_FUNCTIONS})
set(i386_FUNCTIONS ${common_FUNCTIONS} ${i386_FUNCTIONS})
set(x86_64_FUNCTIONS ${common_FUNCTIONS})
diff --git a/lldb/include/lldb/Host/SafeMachO.h b/lldb/include/lldb/Host/SafeMachO.h
index 0540383b8c526..cfb57571d0e3e 100644
--- a/lldb/include/lldb/Host/SafeMachO.h
+++ b/lldb/include/lldb/Host/SafeMachO.h
@@ -90,6 +90,10 @@
#undef CPU_SUBTYPE_ARM_V7M
#undef CPU_SUBTYPE_ARM_V7EM
+#undef CPU_SUBTYPE_ARM_V8M_MAIN
+#undef CPU_SUBTYPE_ARM_V8M_BASE
+#undef CPU_SUBTYPE_ARM_V8_1M_MAIN
+
#undef CPU_SUBTYPE_ARM64E
#undef CPU_SUBTYPE_ARM64_32_V8
#undef CPU_SUBTYPE_ARM64_V8
diff --git a/lldb/include/lldb/Utility/ArchSpec.h b/lldb/include/lldb/Utility/ArchSpec.h
index d12573925272a..160f81c2fa501 100644
--- a/lldb/include/lldb/Utility/ArchSpec.h
+++ b/lldb/include/lldb/Utility/ArchSpec.h
@@ -140,6 +140,9 @@ class ArchSpec {
eCore_arm_armv7k,
eCore_arm_armv7m,
eCore_arm_armv7em,
+ eCore_arm_armv8m_base,
+ eCore_arm_armv8m_main,
+ eCore_arm_armv8_1m_main,
eCore_arm_xscale,
eCore_thumb,
diff --git a/lldb/source/Utility/ArchSpec.cpp b/lldb/source/Utility/ArchSpec.cpp
index fa46a48b7faa9..6eecf4f1b0995 100644
--- a/lldb/source/Utility/ArchSpec.cpp
+++ b/lldb/source/Utility/ArchSpec.cpp
@@ -74,6 +74,12 @@ static constexpr const CoreDefinition g_core_definitions[] = {
"armv7m"},
{eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7em,
"armv7em"},
+ {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm,
+ ArchSpec::eCore_arm_armv8m_base, "armv8m.base"},
+ {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm,
+ ArchSpec::eCore_arm_armv8m_main, "armv8m.main"},
+ {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm,
+ ArchSpec::eCore_arm_armv8_1m_main, "armv8.1m.main"},
{eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_xscale,
"xscale"},
{eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumb,
@@ -318,6 +324,9 @@ static const ArchDefinitionEntry g_macho_arch_entries[] = {
{ArchSpec::eCore_arm_armv7k, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7K, UINT32_MAX, SUBTYPE_MASK},
{ArchSpec::eCore_arm_armv7m, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7M, UINT32_MAX, SUBTYPE_MASK},
{ArchSpec::eCore_arm_armv7em, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7EM, UINT32_MAX, SUBTYPE_MASK},
+ {ArchSpec::eCore_arm_armv8m_base, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V8M_BASE, UINT32_MAX, SUBTYPE_MASK},
+ {ArchSpec::eCore_arm_armv8m_main, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V8M_MAIN, UINT32_MAX, SUBTYPE_MASK},
+ {ArchSpec::eCore_arm_armv8_1m_main, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V8_1M_MAIN, UINT32_MAX, SUBTYPE_MASK},
{ArchSpec::eCore_arm_arm64e, llvm::MachO::CPU_TYPE_ARM64, llvm::MachO::CPU_SUBTYPE_ARM64E, UINT32_MAX, SUBTYPE_MASK},
{ArchSpec::eCore_arm_arm64, llvm::MachO::CPU_TYPE_ARM64, llvm::MachO::CPU_SUBTYPE_ARM64_ALL, UINT32_MAX, SUBTYPE_MASK},
{ArchSpec::eCore_arm_arm64, llvm::MachO::CPU_TYPE_ARM64, llvm::MachO::CPU_SUBTYPE_ARM64_V8, UINT32_MAX, SUBTYPE_MASK},
diff --git a/lldb/tools/debugserver/source/DNB.cpp b/lldb/tools/debugserver/source/DNB.cpp
index 0b98e492dfb9d..91b0ea2edc5d3 100644
--- a/lldb/tools/debugserver/source/DNB.cpp
+++ b/lldb/tools/debugserver/source/DNB.cpp
@@ -1880,6 +1880,15 @@ nub_bool_t DNBSetArchitecture(const char *arch) {
else if (strstr(arch, "arm64") == arch || strstr(arch, "aarch64") == arch)
return DNBArchProtocol::SetArchitecture(CPU_TYPE_ARM64,
CPU_SUBTYPE_ARM64_ALL);
+ else if (strstr(arch, "armv8m.main") == arch)
+ return DNBArchProtocol::SetArchitecture(CPU_TYPE_ARM,
+ CPU_SUBTYPE_ARM_V8M_MAIN);
+ else if (strstr(arch, "armv8m.base") == arch)
+ return DNBArchProtocol::SetArchitecture(CPU_TYPE_ARM,
+ CPU_SUBTYPE_ARM_V8M_BASE);
+ else if (strstr(arch, "armv8.1m.main") == arch)
+ return DNBArchProtocol::SetArchitecture(CPU_TYPE_ARM,
+ CPU_SUBTYPE_ARM_V8_1M_MAIN);
else if (strstr(arch, "armv8") == arch)
return DNBArchProtocol::SetArchitecture(CPU_TYPE_ARM64,
CPU_SUBTYPE_ARM64_V8);
diff --git a/llvm/include/llvm/BinaryFormat/MachO.h b/llvm/include/llvm/BinaryFormat/MachO.h
index 4dfc1ff204555..bea1bcaf2bf75 100644
--- a/llvm/include/llvm/BinaryFormat/MachO.h
+++ b/llvm/include/llvm/BinaryFormat/MachO.h
@@ -1693,7 +1693,10 @@ enum CPUSubTypeARM {
CPU_SUBTYPE_ARM_V7K = 12,
CPU_SUBTYPE_ARM_V6M = 14,
CPU_SUBTYPE_ARM_V7M = 15,
- CPU_SUBTYPE_ARM_V7EM = 16
+ CPU_SUBTYPE_ARM_V7EM = 16,
+ CPU_SUBTYPE_ARM_V8M_MAIN = 17,
+ CPU_SUBTYPE_ARM_V8M_BASE = 18,
+ CPU_SUBTYPE_ARM_V8_1M_MAIN = 19,
};
enum CPUSubTypeARM64 : uint32_t {
diff --git a/llvm/include/llvm/TextAPI/Architecture.def b/llvm/include/llvm/TextAPI/Architecture.def
index 53877cf0b60ce..0caf58e1825d9 100644
--- a/llvm/include/llvm/TextAPI/Architecture.def
+++ b/llvm/include/llvm/TextAPI/Architecture.def
@@ -30,7 +30,9 @@ ARCHINFO(armv7k, armv7k, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V7K, 32)
ARCHINFO(armv6m, armv6m, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V6M, 32)
ARCHINFO(armv7m, armv7m, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V7M, 32)
ARCHINFO(armv7em, armv7em, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V7EM, 32)
-
+ARCHINFO(armv8m_main, armv8m.main, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V8M_BASE, 32)
+ARCHINFO(armv8m_base, armv8m.base, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V8M_BASE, 32)
+ARCHINFO(armv8_1m_main, armv8.1m.main, MachO::CPU_TYPE_ARM, MachO::CPU_SUBTYPE_ARM_V8_1M_MAIN, 32)
///
/// ARM64 architectures sorted by cpu sub type id.
diff --git a/llvm/lib/BinaryFormat/MachO.cpp b/llvm/lib/BinaryFormat/MachO.cpp
index 369b5ba927136..046a79bbd7c5f 100644
--- a/llvm/lib/BinaryFormat/MachO.cpp
+++ b/llvm/lib/BinaryFormat/MachO.cpp
@@ -51,6 +51,12 @@ static MachO::CPUSubTypeARM getARMSubType(const Triple &T) {
return MachO::CPU_SUBTYPE_ARM_V7M;
case ARM::ArchKind::ARMV7EM:
return MachO::CPU_SUBTYPE_ARM_V7EM;
+ case ARM::ArchKind::ARMV8MBaseline:
+ return MachO::CPU_SUBTYPE_ARM_V8M_BASE;
+ case ARM::ArchKind::ARMV8MMainline:
+ return MachO::CPU_SUBTYPE_ARM_V8M_MAIN;
+ case ARM::ArchKind::ARMV8_1MMainline:
+ return MachO::CPU_SUBTYPE_ARM_V8_1M_MAIN;
}
}
diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp
index 87d0c9806411e..13b4592c98a43 100644
--- a/llvm/lib/Object/MachOObjectFile.cpp
+++ b/llvm/lib/Object/MachOObjectFile.cpp
@@ -2839,6 +2839,24 @@ Triple MachOObjectFile::getArchTriple(uint32_t CPUType, uint32_t CPUSubType,
if (ArchFlag)
*ArchFlag = "armv7s";
return Triple("armv7s-apple-darwin");
+ case MachO::CPU_SUBTYPE_ARM_V8M_BASE:
+ if (McpuDefault)
+ *McpuDefault = "cortex-m23";
+ if (ArchFlag)
+ *ArchFlag = "armv8m.base";
+ return Triple("thumbv8m-apple-darwin");
+ case MachO::CPU_SUBTYPE_ARM_V8M_MAIN:
+ if (McpuDefault)
+ *McpuDefault = "cortex-m23";
+ if (ArchFlag)
+ *ArchFlag = "armv8m.main";
+ return Triple("thumbv8m-apple-darwin");
+ case MachO::CPU_SUBTYPE_ARM_V8_1M_MAIN:
+ if (McpuDefault)
+ *McpuDefault = "cortex-m52";
+ if (ArchFlag)
+ *ArchFlag = "armv8.1m.main";
+ return Triple("thumbv8m-apple-darwin");
default:
return Triple();
}
@@ -2912,24 +2930,11 @@ bool MachOObjectFile::isValidArch(StringRef ArchFlag) {
}
ArrayRef<StringRef> MachOObjectFile::getValidArchs() {
- static const std::array<StringRef, 18> ValidArchs = {{
- "i386",
- "x86_64",
- "x86_64h",
- "armv4t",
- "arm",
- "armv5e",
- "armv6",
- "armv6m",
- "armv7",
- "armv7em",
- "armv7k",
- "armv7m",
- "armv7s",
- "arm64",
- "arm64e",
- "arm64_32",
- "ppc",
+ static const std::array<StringRef, 21> ValidArchs = {{
+ "i386", "x86_64", "x86_64h", "armv4t", "arm",
+ "armv5e", "armv6", "armv6m", "armv7", "armv7em",
+ "armv7k", "armv7m", "armv7s", "armv8m.base", "armv8m.main",
+ "armv8.1m.main", "arm64", "arm64e", "arm64_32", "ppc",
"ppc64",
}};
diff --git a/llvm/test/CodeGen/ARM/MachO-subtypes.ll b/llvm/test/CodeGen/ARM/MachO-subtypes.ll
index f5cc20a4d0703..d4e548cbe867e 100644
--- a/llvm/test/CodeGen/ARM/MachO-subtypes.ll
+++ b/llvm/test/CodeGen/ARM/MachO-subtypes.ll
@@ -53,6 +53,13 @@
; RUN: llc -mtriple=thumbv7s-apple-darwin -filetype=obj -o - < %s \
; RUN: | llvm-readobj --file-headers - | FileCheck %s --check-prefix=CHECK-V7S
+; RUN: llc -mtriple=armv8m.main-apple-darwin -mcpu=cortex-m55 -filetype=obj -o - < %s \
+; RUN: | llvm-readobj --file-headers - | FileCheck %s --check-prefix=CHECK-V8M-MAIN
+; RUN: llc -mtriple=armv8m.base-apple-darwin -mcpu=cortex-m33 -filetype=obj -o - < %s \
+; RUN: | llvm-readobj --file-headers - | FileCheck %s --check-prefix=CHECK-V8M-BASE
+; RUN: llc -mtriple=armv8.1m.main-apple-darwin -mcpu=cortex-m55 -filetype=obj -o - < %s \
+; RUN: | llvm-readobj --file-headers - | FileCheck %s --check-prefix=CHECK-V8_1M-MAIN
+
define void @_test() {
ret void
}
@@ -66,3 +73,6 @@ define void @_test() {
; CHECK-V7K: CpuSubType: CPU_SUBTYPE_ARM_V7K (0xC)
; CHECK-V7M: CpuSubType: CPU_SUBTYPE_ARM_V7M (0xF)
; CHECK-V7S: CpuSubType: CPU_SUBTYPE_ARM_V7S (0xB)
+; CHECK-V8M-MAIN: CpuSubType: CPU_SUBTYPE_ARM_V8M_MAIN (0x11)
+; CHECK-V8M-BASE: CpuSubType: CPU_SUBTYPE_ARM_V8M_BASE (0x12)
+; CHECK-V8_1M-MAIN: CpuSubType: CPU_SUBTYPE_ARM_V8_1M_MAIN (0x13)
diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp
index 2aa7e47737077..3541219c19816 100644
--- a/llvm/tools/llvm-objdump/MachODump.cpp
+++ b/llvm/tools/llvm-objdump/MachODump.cpp
@@ -2311,6 +2311,18 @@ static void printCPUType(uint32_t cputype, uint32_t cpusubtype) {
outs() << " cputype CPU_TYPE_ARM\n";
outs() << " cpusubtype CPU_SUBTYPE_ARM_V7S\n";
break;
+ case MachO::CPU_SUBTYPE_ARM_V8M_MAIN:
+ outs() << " cputype CPU_TYPE_ARM\n";
+ outs() << " cpusubtype CPU_SUBTYPE_ARM_V8M_MAIN\n";
+ break;
+ case MachO::CPU_SUBTYPE_ARM_V8M_BASE:
+ outs() << " cputype CPU_TYPE_ARM\n";
+ outs() << " cpusubtype CPU_SUBTYPE_ARM_V8M_BASE\n";
+ break;
+ case MachO::CPU_SUBTYPE_ARM_V8_1M_MAIN:
+ outs() << " cputype CPU_TYPE_ARM\n";
+ outs() << " cpusubtype CPU_SUBTYPE_ARM_V8_1M_MAIN\n";
+ break;
default:
printUnknownCPUType(cputype, cpusubtype);
break;
@@ -8373,6 +8385,15 @@ static void PrintMachHeader(uint32_t magic, uint32_t cputype,
case MachO::CPU_SUBTYPE_ARM_V7S:
outs() << " V7S";
break;
+ case MachO::CPU_SUBTYPE_ARM_V8M_MAIN:
+ outs() << " V8M_MAIN";
+ break;
+ case MachO::CPU_SUBTYPE_ARM_V8M_BASE:
+ outs() << " V8M_BASE";
+ break;
+ case MachO::CPU_SUBTYPE_ARM_V8_1M_MAIN:
+ outs() << " V8_1M_MAIN";
+ break;
default:
outs() << format(" %10d", cpusubtype & ~MachO::CPU_SUBTYPE_MASK);
break;
diff --git a/llvm/tools/llvm-readobj/MachODumper.cpp b/llvm/tools/llvm-readobj/MachODumper.cpp
index 6ba32621f631b..41afd112b1a6a 100644
--- a/llvm/tools/llvm-readobj/MachODumper.cpp
+++ b/llvm/tools/llvm-readobj/MachODumper.cpp
@@ -155,18 +155,21 @@ const EnumEntry<uint32_t> MachOHeaderCpuSubtypesX64[] = {
};
const EnumEntry<uint32_t> MachOHeaderCpuSubtypesARM[] = {
- LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_ALL),
- LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V4T),
- LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V6),
- LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V5),
- LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V5TEJ),
- LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_XSCALE),
- LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V7),
- LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V7S),
- LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V7K),
- LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V6M),
- LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V7M),
- LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V7EM),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_ALL),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V4T),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V6),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V5),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V5TEJ),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_XSCALE),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V7),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V7S),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V7K),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V6M),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V7M),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V7EM),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V8M_MAIN),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V8M_BASE),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V8_1M_MAIN),
};
const EnumEntry<uint32_t> MachOHeaderCpuSubtypesARM64_32[] = {
diff --git a/llvm/unittests/BinaryFormat/MachOTest.cpp b/llvm/unittests/BinaryFormat/MachOTest.cpp
index e10cc3112664f..91558f7838016 100644
--- a/llvm/unittests/BinaryFormat/MachOTest.cpp
+++ b/llvm/unittests/BinaryFormat/MachOTest.cpp
@@ -108,6 +108,10 @@ TEST(MachOTest, CPUSubType) {
CHECK_CPUSUBTYPE("arm64-apple-darwin", MachO::CPU_SUBTYPE_ARM64_ALL);
CHECK_CPUSUBTYPE("arm64e-apple-darwin", MachO::CPU_SUBTYPE_ARM64E);
CHECK_CPUSUBTYPE("arm64_32-apple-darwin", MachO::CPU_SUBTYPE_ARM64_32_V8);
+ CHECK_CPUSUBTYPE("armv8m.main-apple-darwin", MachO::CPU_SUBTYPE_ARM_V8M_MAIN);
+ CHECK_CPUSUBTYPE("armv8m.base-apple-darwin", MachO::CPU_SUBTYPE_ARM_V8M_BASE);
+ CHECK_CPUSUBTYPE("armv8.1m.main-apple-darwin",
+ MachO::CPU_SUBTYPE_ARM_V8_1M_MAIN);
{
// Not a mach-o.
More information about the lldb-commits
mailing list