packages feed

llvm-pretty-0.12.0.0: src/Text/LLVM/Triple/Print.hs

{- |
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 =
  \case
    UnknownArch -> "unknown"
    AArch64 -> "aarch64"
    AArch64_32 -> "aarch64_32"
    AArch64_BE -> "aarch64_be"
    AMDGCN -> "amdgcn"
    AMDIL64 -> "amdil64"
    AMDIL -> "amdil"
    ARC -> "arc"
    ARM -> "arm"
    ARMEB -> "armeb"
    AVR -> "avr"
    BPFEB -> "bpfeb"
    BPFEL -> "bpfel"
    CSKY -> "csky"
    DXIL -> "dxil"
    Hexagon -> "hexagon"
    HSAIL64 -> "hsail64"
    HSAIL -> "hsail"
    Kalimba -> "kalimba"
    Lanai -> "lanai"
    Le32 -> "le32"
    Le64 -> "le64"
    LoongArch32 -> "loongarch32"
    LoongArch64 -> "loongarch64"
    M68k -> "m68k"
    MIPS64 -> "mips64"
    MIPS64EL -> "mips64el"
    MIPS -> "mips"
    MIPSEL -> "mipsel"
    MSP430 -> "msp430"
    NVPTX64 -> "nvptx64"
    NVPTX -> "nvptx"
    PPC64 -> "powerpc64"
    PPC64LE -> "powerpc64le"
    PPC -> "powerpc"
    PPCLE -> "powerpcle"
    R600 -> "r600"
    RenderScript32 -> "renderscript32"
    RenderScript64 -> "renderscript64"
    RISCV32 -> "riscv32"
    RISCV64 -> "riscv64"
    SHAVE -> "shave"
    Sparc -> "sparc"
    SparcEL -> "sparcel"
    Sparcv9 -> "sparcv9"
    SPIR64 -> "spir64"
    SPIR -> "spir"
    SPIRV32 -> "spirv32"
    SPIRV64 -> "spirv64"
    SystemZ -> "s390x"
    TCE -> "tce"
    TCELE -> "tcele"
    Thumb -> "thumb"
    ThumbEB -> "thumbeb"
    VE -> "ve"
    Wasm32 -> "wasm32"
    Wasm64 -> "wasm64"
    X86 -> "i386"
    X86_64 -> "x86_64"
    XCore -> "xcore"

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

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

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

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

printTriple :: TargetTriple -> String
printTriple tt =
  List.intercalate
    "-"
    [ archName (ttArch tt)
    , vendorName (ttVendor tt)
    , osName (ttOS tt)
    , envName (ttEnv tt)
    , objFmtName (ttObjFmt tt)
    ]