{- |
Module      : Text.LLVM.Triple.Print
Description : Printing of LLVM target triples.
License     : BSD3
Maintainer  : Langston Barrett
Stability   : experimental
-}

{-# LANGUAGE LambdaCase #-}

module Text.LLVM.Triple.Print
  ( archName
  , vendorName
  , osName
  , envName
  , objFmtName
  , printTriple
  ) where

import qualified Data.List as List

import Text.LLVM.Triple.AST

-- | @llvm::Triple::getArchTypeName@.
--
-- Retained in the order in which they appear in the LLVM source, rather than an
-- order consistent with the constructors of 'Arch'.
archName :: Arch -> String
archName :: Arch -> String
archName =
  \case
    Arch
UnknownArch -> String
"unknown"
    Arch
AArch64 -> String
"aarch64"
    Arch
AArch64_32 -> String
"aarch64_32"
    Arch
AArch64_BE -> String
"aarch64_be"
    Arch
AMDGCN -> String
"amdgcn"
    Arch
AMDIL64 -> String
"amdil64"
    Arch
AMDIL -> String
"amdil"
    Arch
ARC -> String
"arc"
    Arch
ARM -> String
"arm"
    Arch
ARMEB -> String
"armeb"
    Arch
AVR -> String
"avr"
    Arch
BPFEB -> String
"bpfeb"
    Arch
BPFEL -> String
"bpfel"
    Arch
CSKY -> String
"csky"
    Arch
DXIL -> String
"dxil"
    Arch
Hexagon -> String
"hexagon"
    Arch
HSAIL64 -> String
"hsail64"
    Arch
HSAIL -> String
"hsail"
    Arch
Kalimba -> String
"kalimba"
    Arch
Lanai -> String
"lanai"
    Arch
Le32 -> String
"le32"
    Arch
Le64 -> String
"le64"
    Arch
LoongArch32 -> String
"loongarch32"
    Arch
LoongArch64 -> String
"loongarch64"
    Arch
M68k -> String
"m68k"
    Arch
MIPS64 -> String
"mips64"
    Arch
MIPS64EL -> String
"mips64el"
    Arch
MIPS -> String
"mips"
    Arch
MIPSEL -> String
"mipsel"
    Arch
MSP430 -> String
"msp430"
    Arch
NVPTX64 -> String
"nvptx64"
    Arch
NVPTX -> String
"nvptx"
    Arch
PPC64 -> String
"powerpc64"
    Arch
PPC64LE -> String
"powerpc64le"
    Arch
PPC -> String
"powerpc"
    Arch
PPCLE -> String
"powerpcle"
    Arch
R600 -> String
"r600"
    Arch
RenderScript32 -> String
"renderscript32"
    Arch
RenderScript64 -> String
"renderscript64"
    Arch
RISCV32 -> String
"riscv32"
    Arch
RISCV64 -> String
"riscv64"
    Arch
SHAVE -> String
"shave"
    Arch
Sparc -> String
"sparc"
    Arch
SparcEL -> String
"sparcel"
    Arch
Sparcv9 -> String
"sparcv9"
    Arch
SPIR64 -> String
"spir64"
    Arch
SPIR -> String
"spir"
    Arch
SPIRV32 -> String
"spirv32"
    Arch
SPIRV64 -> String
"spirv64"
    Arch
SystemZ -> String
"s390x"
    Arch
TCE -> String
"tce"
    Arch
TCELE -> String
"tcele"
    Arch
Thumb -> String
"thumb"
    Arch
ThumbEB -> String
"thumbeb"
    Arch
VE -> String
"ve"
    Arch
Wasm32 -> String
"wasm32"
    Arch
Wasm64 -> String
"wasm64"
    Arch
X86 -> String
"i386"
    Arch
X86_64 -> String
"x86_64"
    Arch
XCore -> String
"xcore"

-- | @llvm::Triple::getVendorTypeName@.
--
-- Retained in the order in which they appear in the LLVM source.
vendorName :: Vendor -> String
vendorName :: Vendor -> String
vendorName =
  \case
    Vendor
UnknownVendor -> String
"unknown"
    Vendor
AMD -> String
"amd"
    Vendor
Apple -> String
"apple"
    Vendor
CSR -> String
"csr"
    Vendor
Freescale -> String
"fsl"
    Vendor
IBM -> String
"ibm"
    Vendor
ImaginationTechnologies -> String
"img"
    Vendor
Mesa -> String
"mesa"
    Vendor
MipsTechnologies -> String
"mti"
    Vendor
Myriad -> String
"myriad"
    Vendor
NVIDIA -> String
"nvidia"
    Vendor
OpenEmbedded -> String
"oe"
    Vendor
PC -> String
"pc"
    Vendor
SCEI -> String
"scei"
    Vendor
SUSE -> String
"suse"

-- | @llvm::Triple::getOSTypeName@.
--
-- Retained in the order in which they appear in the LLVM source.
osName :: OS -> String
osName :: OS -> String
osName =
  \case
    OS
UnknownOS -> String
"unknown"
    OS
AIX -> String
"aix"
    OS
AMDHSA -> String
"amdhsa"
    OS
AMDPAL -> String
"amdpal"
    OS
Ananas -> String
"ananas"
    OS
CUDA -> String
"cuda"
    OS
CloudABI -> String
"cloudabi"
    OS
Contiki -> String
"contiki"
    OS
Darwin -> String
"darwin"
    OS
DragonFly -> String
"dragonfly"
    OS
DriverKit -> String
"driverkit"
    OS
ELFIAMCU -> String
"elfiamcu"
    OS
Emscripten -> String
"emscripten"
    OS
FreeBSD -> String
"freebsd"
    OS
Fuchsia -> String
"fuchsia"
    OS
Haiku -> String
"haiku"
    OS
HermitCore -> String
"hermit"
    OS
Hurd -> String
"hurd"
    OS
IOS -> String
"ios"
    OS
KFreeBSD -> String
"kfreebsd"
    OS
Linux -> String
"linux"
    OS
Lv2 -> String
"lv2"
    OS
MacOSX -> String
"macosx"
    OS
Mesa3D -> String
"mesa3d"
    OS
Minix -> String
"minix"
    OS
NVCL -> String
"nvcl"
    OS
NaCl -> String
"nacl"
    OS
NetBSD -> String
"netbsd"
    OS
OpenBSD -> String
"openbsd"
    OS
PS4 -> String
"ps4"
    OS
PS5 -> String
"ps5"
    OS
RTEMS -> String
"rtems"
    OS
Solaris -> String
"solaris"
    OS
TvOS -> String
"tvos"
    OS
WASI -> String
"wasi"
    OS
WatchOS -> String
"watchos"
    OS
Win32 -> String
"windows"
    OS
ZOS -> String
"zos"
    OS
ShaderModel -> String
"shadermodel"

-- | @llvm::Triple::getEnvironmentName@.
--
-- Retained in the order in which they appear in the LLVM source.
envName :: Environment -> String
envName :: Environment -> String
envName =
  \case
  Environment
UnknownEnvironment -> String
"unknown"
  Environment
Android -> String
"android"
  Environment
CODE16 -> String
"code16"
  Environment
CoreCLR -> String
"coreclr"
  Environment
Cygnus -> String
"cygnus"
  Environment
EABI -> String
"eabi"
  Environment
EABIHF -> String
"eabihf"
  Environment
GNU -> String
"gnu"
  Environment
GNUABI64 -> String
"gnuabi64"
  Environment
GNUABIN32 -> String
"gnuabin32"
  Environment
GNUEABI -> String
"gnueabi"
  Environment
GNUEABIHF -> String
"gnueabihf"
  Environment
GNUX32 -> String
"gnux32"
  Environment
GNUILP32 -> String
"gnu_ilp32"
  Environment
Itanium -> String
"itanium"
  Environment
MSVC -> String
"msvc"
  Environment
MacABI -> String
"macabi"
  Environment
Musl -> String
"musl"
  Environment
MuslEABI -> String
"musleabi"
  Environment
MuslEABIHF -> String
"musleabihf"
  Environment
MuslX32 -> String
"muslx32"
  Environment
Simulator -> String
"simulator"
  Environment
Pixel -> String
"pixel"
  Environment
Vertex -> String
"vertex"
  Environment
Geometry -> String
"geometry"
  Environment
Hull -> String
"hull"
  Environment
Domain -> String
"domain"
  Environment
Compute -> String
"compute"
  Environment
Library -> String
"library"
  Environment
RayGeneration -> String
"raygeneration"
  Environment
Intersection -> String
"intersection"
  Environment
AnyHit -> String
"anyhit"
  Environment
ClosestHit -> String
"closesthit"
  Environment
Miss -> String
"miss"
  Environment
Callable -> String
"callable"
  Environment
Mesh -> String
"mesh"
  Environment
Amplification -> String
"amplification"

-- | @llvm::Triple::getObjectFormatTypeName@
--
-- Retained in the order in which they appear in the LLVM source.
objFmtName :: ObjectFormat -> String
objFmtName :: ObjectFormat -> String
objFmtName =
  \case
    ObjectFormat
UnknownObjectFormat -> String
""  -- NB: Not "unknown"
    ObjectFormat
COFF -> String
"coff"
    ObjectFormat
ELF -> String
"elf"
    ObjectFormat
GOFF -> String
"goff"
    ObjectFormat
MachO -> String
"macho"
    ObjectFormat
Wasm -> String
"wasm"
    ObjectFormat
XCOFF -> String
"xcoff"
    ObjectFormat
DXContainer -> String
"dxcontainer"
    ObjectFormat
SPIRV -> String
"spirv"

printTriple :: TargetTriple -> String
printTriple :: TargetTriple -> String
printTriple TargetTriple
tt =
  String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
List.intercalate
    String
"-"
    [ Arch -> String
archName (TargetTriple -> Arch
ttArch TargetTriple
tt)
    , Vendor -> String
vendorName (TargetTriple -> Vendor
ttVendor TargetTriple
tt)
    , OS -> String
osName (TargetTriple -> OS
ttOS TargetTriple
tt)
    , Environment -> String
envName (TargetTriple -> Environment
ttEnv TargetTriple
tt)
    , ObjectFormat -> String
objFmtName (TargetTriple -> ObjectFormat
ttObjFmt TargetTriple
tt)
    ]