Skip to content

Commit 1121034

Browse files
committed
Triple: Record default exception handling type
Currently the default exception handling type is scattered across the backends in MCAsmInfo constructors. Allow this to be computed from the triple so the IR can centrally determine the set of ABI calls. Manually submitting, closes #147225
1 parent b7c4ac2 commit 1121034

File tree

5 files changed

+210
-1
lines changed

5 files changed

+210
-1
lines changed

llvm/include/llvm/TargetParser/Triple.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#undef sparc
2121

2222
namespace llvm {
23+
enum class ExceptionHandling;
2324
class Twine;
2425

2526
/// Triple - Helper class for working with autoconf configuration names. For
@@ -1321,6 +1322,8 @@ class Triple {
13211322
/// Returns whether an OS version is invalid and would not map to an Apple OS.
13221323
LLVM_ABI static bool isValidVersionForOS(OSType OSKind,
13231324
const VersionTuple &Version);
1325+
1326+
LLVM_ABI ExceptionHandling getDefaultExceptionHandling() const;
13241327
};
13251328

13261329
} // End llvm namespace

llvm/lib/CodeGen/CodeGenTargetMachineImpl.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ void CodeGenTargetMachineImpl::initAsmInfo() {
8080

8181
TmpAsmInfo->setFullRegisterNames(Options.MCOptions.PPCUseFullRegisterNames);
8282

83+
assert(TmpAsmInfo->getExceptionHandlingType() ==
84+
getTargetTriple().getDefaultExceptionHandling() &&
85+
"MCAsmInfo and Triple disagree on default exception handling type");
86+
8387
if (Options.ExceptionModel != ExceptionHandling::None)
8488
TmpAsmInfo->setExceptionsType(Options.ExceptionModel);
8589

llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ static MCAsmInfo *createMipsMCAsmInfo(const MCRegisterInfo &MRI,
174174
const MCTargetOptions &Options) {
175175
MCAsmInfo *MAI;
176176

177-
if (TT.isOSWindows())
177+
if (TT.isOSBinFormatCOFF())
178178
MAI = new MipsCOFFMCAsmInfo();
179179
else
180180
MAI = new MipsELFMCAsmInfo(TT, Options);

llvm/lib/TargetParser/Triple.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "llvm/ADT/SmallString.h"
1212
#include "llvm/ADT/StringExtras.h"
1313
#include "llvm/ADT/StringSwitch.h"
14+
#include "llvm/Support/CodeGen.h"
1415
#include "llvm/Support/ErrorHandling.h"
1516
#include "llvm/Support/SwapByteOrder.h"
1617
#include "llvm/Support/VersionTuple.h"
@@ -2255,6 +2256,55 @@ bool Triple::isValidVersionForOS(OSType OSKind, const VersionTuple &Version) {
22552256
llvm_unreachable("unexpected or invalid os version");
22562257
}
22572258

2259+
ExceptionHandling Triple::getDefaultExceptionHandling() const {
2260+
if (isOSBinFormatCOFF()) {
2261+
if (getArch() == Triple::x86 &&
2262+
(isOSCygMing() || isWindowsItaniumEnvironment()))
2263+
return ExceptionHandling::DwarfCFI;
2264+
return ExceptionHandling::WinEH;
2265+
}
2266+
2267+
if (isOSBinFormatXCOFF())
2268+
return ExceptionHandling::AIX;
2269+
if (isOSBinFormatGOFF())
2270+
return ExceptionHandling::ZOS;
2271+
2272+
if (isARM() || isThumb()) {
2273+
if (isOSBinFormatELF()) {
2274+
return getOS() == Triple::NetBSD ? ExceptionHandling::DwarfCFI
2275+
: ExceptionHandling::ARM;
2276+
}
2277+
2278+
return isOSDarwin() && !isWatchABI() ? ExceptionHandling::SjLj
2279+
: ExceptionHandling::DwarfCFI;
2280+
}
2281+
2282+
if (isAArch64() || isX86() || isPPC() || isMIPS() || isSPARC() || isBPF() ||
2283+
isRISCV() || isLoongArch())
2284+
return ExceptionHandling::DwarfCFI;
2285+
2286+
switch (getArch()) {
2287+
case Triple::arc:
2288+
case Triple::csky:
2289+
case Triple::hexagon:
2290+
case Triple::lanai:
2291+
case Triple::msp430:
2292+
case Triple::systemz:
2293+
case Triple::xcore:
2294+
case Triple::xtensa:
2295+
return ExceptionHandling::DwarfCFI;
2296+
default:
2297+
break;
2298+
}
2299+
2300+
// Explicitly none targets.
2301+
if (isWasm() || isAMDGPU() || isNVPTX() || isSPIROrSPIRV())
2302+
return ExceptionHandling::None;
2303+
2304+
// Default to none.
2305+
return ExceptionHandling::None;
2306+
}
2307+
22582308
// HLSL triple environment orders are relied on in the front end
22592309
static_assert(Triple::Vertex - Triple::Pixel == 1,
22602310
"incorrect HLSL stage order");

llvm/unittests/TargetParser/TripleTest.cpp

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "llvm/TargetParser/Triple.h"
10+
#include "llvm/Support/CodeGen.h"
1011
#include "llvm/Support/FormatVariadic.h"
1112
#include "llvm/Support/VersionTuple.h"
1213
#include "gtest/gtest.h"
@@ -2757,6 +2758,157 @@ TEST(TripleTest, FileFormat) {
27572758
EXPECT_EQ(Triple::DXContainer, Triple("dxil-apple-macosx").getObjectFormat());
27582759
}
27592760

2761+
TEST(TripleTest, DefaultExceptionHandling) {
2762+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2763+
Triple("i686-unknown-linux-gnu").getDefaultExceptionHandling());
2764+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2765+
Triple("i686-unknown-freebsd").getDefaultExceptionHandling());
2766+
2767+
EXPECT_EQ(ExceptionHandling::None,
2768+
Triple("wasm32-unknown-wasi-wasm").getDefaultExceptionHandling());
2769+
EXPECT_EQ(ExceptionHandling::None,
2770+
Triple("wasm64-unknown-wasi-wasm").getDefaultExceptionHandling());
2771+
2772+
EXPECT_EQ(
2773+
ExceptionHandling::ARM,
2774+
Triple("arm-unknown-linux-android16").getDefaultExceptionHandling());
2775+
2776+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2777+
Triple("armv6-unknown-netbsd-eabi").getDefaultExceptionHandling());
2778+
EXPECT_EQ(ExceptionHandling::ARM,
2779+
Triple("armv7-suse-linux-gnueabihf").getDefaultExceptionHandling());
2780+
EXPECT_EQ(ExceptionHandling::ARM,
2781+
Triple("thumbv7-linux-gnueabihf").getDefaultExceptionHandling());
2782+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2783+
Triple("thumbv7-none-netbsd").getDefaultExceptionHandling());
2784+
2785+
EXPECT_EQ(ExceptionHandling::ZOS,
2786+
Triple("s390x-ibm-zos").getDefaultExceptionHandling());
2787+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2788+
Triple("systemz-ibm-linux").getDefaultExceptionHandling());
2789+
2790+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2791+
Triple("sparcel-unknown-unknown").getDefaultExceptionHandling());
2792+
2793+
EXPECT_EQ(ExceptionHandling::None,
2794+
Triple("amdgcn--").getDefaultExceptionHandling());
2795+
EXPECT_EQ(ExceptionHandling::None,
2796+
Triple("nvptx64--").getDefaultExceptionHandling());
2797+
EXPECT_EQ(ExceptionHandling::None,
2798+
Triple("spirv32--").getDefaultExceptionHandling());
2799+
EXPECT_EQ(ExceptionHandling::None,
2800+
Triple("spirv64--").getDefaultExceptionHandling());
2801+
2802+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2803+
Triple("i686-pc-windows-msvc-elf").getDefaultExceptionHandling());
2804+
EXPECT_EQ(ExceptionHandling::WinEH,
2805+
Triple("i686-pc-windows-msvc").getDefaultExceptionHandling());
2806+
2807+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2808+
Triple("i386-apple-darwin9").getDefaultExceptionHandling());
2809+
2810+
EXPECT_EQ(ExceptionHandling::WinEH,
2811+
Triple("x86_64-unknown-uefi").getDefaultExceptionHandling());
2812+
EXPECT_EQ(ExceptionHandling::DwarfCFI, // ???
2813+
Triple("x86_64-unknown-msvc").getDefaultExceptionHandling());
2814+
2815+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2816+
Triple("riscv32-unknown-unknown").getDefaultExceptionHandling());
2817+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2818+
Triple("riscv64-unknown-unknown").getDefaultExceptionHandling());
2819+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2820+
Triple("xcore-unknown-unknown").getDefaultExceptionHandling());
2821+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2822+
Triple("xtensa-unknown-unknown").getDefaultExceptionHandling());
2823+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2824+
Triple("lanai-unknown-unknown").getDefaultExceptionHandling());
2825+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2826+
Triple("arc-unknown-unknown").getDefaultExceptionHandling());
2827+
EXPECT_EQ(
2828+
ExceptionHandling::DwarfCFI,
2829+
Triple("loongarch32-unknown-unknown").getDefaultExceptionHandling());
2830+
EXPECT_EQ(
2831+
ExceptionHandling::DwarfCFI,
2832+
Triple("loongarch64-unknown-unknown").getDefaultExceptionHandling());
2833+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2834+
Triple("msp430-unknown-unknown").getDefaultExceptionHandling());
2835+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2836+
Triple("csky-unknown-unknown").getDefaultExceptionHandling());
2837+
2838+
EXPECT_EQ(ExceptionHandling::AIX,
2839+
Triple("powerpc-ibm-aix").getDefaultExceptionHandling());
2840+
EXPECT_EQ(ExceptionHandling::AIX,
2841+
Triple("powerpc---xcoff").getDefaultExceptionHandling());
2842+
2843+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2844+
Triple("powerpc-apple-macosx").getDefaultExceptionHandling());
2845+
2846+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2847+
Triple("i686-pc-cygwin-elf").getDefaultExceptionHandling());
2848+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2849+
Triple("x86_64-pc-cygwin-elf").getDefaultExceptionHandling());
2850+
EXPECT_EQ(ExceptionHandling::WinEH,
2851+
Triple("x86_64-pc-win32").getDefaultExceptionHandling());
2852+
EXPECT_EQ(ExceptionHandling::WinEH,
2853+
Triple("x86_64-pc-windows-coreclr").getDefaultExceptionHandling());
2854+
2855+
EXPECT_EQ(ExceptionHandling::None,
2856+
Triple("ve-unknown-linux").getDefaultExceptionHandling());
2857+
EXPECT_EQ(ExceptionHandling::None,
2858+
Triple("ve-unknown-unknown").getDefaultExceptionHandling());
2859+
2860+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2861+
Triple("armv7k-apple-watchos").getDefaultExceptionHandling());
2862+
EXPECT_EQ(ExceptionHandling::SjLj,
2863+
Triple("armv7-apple-ios").getDefaultExceptionHandling());
2864+
2865+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2866+
Triple("mips64-mti-linux-gnu").getDefaultExceptionHandling());
2867+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2868+
Triple("mips").getDefaultExceptionHandling());
2869+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2870+
Triple("mips-pc-windows-msvc").getDefaultExceptionHandling());
2871+
EXPECT_EQ(ExceptionHandling::WinEH,
2872+
Triple("mips-pc-windows-msvc-coff").getDefaultExceptionHandling());
2873+
2874+
EXPECT_EQ(ExceptionHandling::WinEH,
2875+
Triple("mipsel-windows--coff").getDefaultExceptionHandling());
2876+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2877+
Triple("mipsel-windows-msvc").getDefaultExceptionHandling());
2878+
2879+
EXPECT_EQ(
2880+
ExceptionHandling::WinEH,
2881+
Triple("aarch64-unknown-windows-msvc").getDefaultExceptionHandling());
2882+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2883+
Triple("aarch64-unknown-unknown").getDefaultExceptionHandling());
2884+
2885+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2886+
Triple("arm64_32-apple-ios").getDefaultExceptionHandling());
2887+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2888+
Triple("arm64-apple-macosx").getDefaultExceptionHandling());
2889+
2890+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2891+
Triple("xcore-xmos-elf").getDefaultExceptionHandling());
2892+
EXPECT_EQ(ExceptionHandling::WinEH,
2893+
Triple("i386-pc-windows-msvc").getDefaultExceptionHandling());
2894+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2895+
Triple("i386-mingw32").getDefaultExceptionHandling());
2896+
EXPECT_EQ(ExceptionHandling::WinEH,
2897+
Triple("i386-pc-win32").getDefaultExceptionHandling());
2898+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2899+
Triple("i386-pc-mingw32").getDefaultExceptionHandling());
2900+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2901+
Triple("i686-pc-cygwin").getDefaultExceptionHandling());
2902+
2903+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2904+
Triple("x86_64-pc-mingw64").getDefaultExceptionHandling());
2905+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2906+
Triple("x86_64-win32-gnu").getDefaultExceptionHandling());
2907+
2908+
EXPECT_EQ(ExceptionHandling::DwarfCFI,
2909+
Triple("x86_64-scei-ps4").getDefaultExceptionHandling());
2910+
}
2911+
27602912
TEST(TripleTest, NormalizeWindows) {
27612913
EXPECT_EQ("i686-pc-windows-msvc", Triple::normalize("i686-pc-win32"));
27622914
EXPECT_EQ("i686-unknown-windows-msvc", Triple::normalize("i686-win32"));

0 commit comments

Comments
 (0)