hLLVM-0.5.0.0: src/Llvm/Syntax/Parser/DataLayout.hs
module Llvm.Syntax.Parser.DataLayout where
import Llvm.Syntax.Parser.Basic
import Llvm.Data.Shared.DataLayout
import Llvm.Data.Shared.AtomicEntity (TargetTriple(..), Arch(..), Vendor(..), Os(..), OsEnv(..))
pLayoutSpec :: P LayoutSpec
pLayoutSpec = choice [ char 'e' >> return (DlE LittleEndian)
, char 'E' >> return (DlE BigEndian)
, try (char 's' >> do { n <- option Nothing (liftM Just unsignedInt)
; aa <- option Nothing (colon >> liftM Just unsignedInt)
; pa <- option Nothing (colon >> liftM Just unsignedInt)
; return (DlLittleS n aa pa)
})
, char 'p' >> do { as <- option (LayoutAddrSpaceUnspecified) (liftM LayoutAddrSpace unsignedInt)
; s <- colon >> liftM SizeInBit unsignedInt
; aa <- colon >> liftM (AbiAlign . AlignInBit) unsignedInt
; pa <- prefAlign
; return (DlP as s aa pa)
}
, dlIVF
, char 'a' >> do { s <- opt (liftM SizeInBit unsignedInt)
; aa <- colon >> liftM (AbiAlign . AlignInBit) unsignedInt
; pa <- prefAlign
; return (DlA s aa pa)
}
, char 'm' >> colon >> liftM DlM (choice [ char 'e' >> return ManglingE
, char 'm' >> return ManglingM
, char 'o' >> return ManglingO
, char 'w' >> return ManglingW
])
, char 'n' >> do { ls <- sepBy1 unsignedInt colon
; return (DlN (fmap SizeInBit ls))
}
, try (symbol "S0" >> return (DlS StackAlignUnspecified))
, char 'S' >> liftM ((DlS . StackAlign . AlignInBit)) unsignedInt
]
where prefAlign = option Nothing (colon >> liftM (Just . PrefAlign . AlignInBit) unsignedInt)
dlIVF = do { df <- choice [ char 'i' >> return DlI
, char 'v' >> return DlV
, char 'f' >> return DlF
]
; s <- liftM SizeInBit unsignedInt
; abi <- colon >> liftM (AbiAlign . AlignInBit) unsignedInt
; pa <- prefAlign
; return (df s abi pa)
}
pDataLayout :: P DataLayout
pDataLayout = liftM DataLayout (sepBy pLayoutSpec (char '-'))
pTargetTriple :: P TargetTriple
pTargetTriple =
do { arch <- choice [ reserved "i386" >> return Arch_i386
, reserved "i686" >> return Arch_i686
, reserved "x86" >> return Arch_x86
, reserved "x86_64" >> return Arch_x86_64
, reserved "powerpc" >> return Arch_PowerPc
, reserved "powerpc64" >> return Arch_PowerPc64
, reserved "arm" >> liftM Arch_Arm pAnyString
, reserved "thumbv7" >> return Arch_ThumbV7
, reserved "mips" >> liftM Arch_Mips pAnyString
, reserved "itanium" >> return Arch_Itanium
, liftM Arch_String pAnyString
]
; vendor <- option Nothing (char '-' >> liftM Just
(choice [ reserved "pc" >> return Vendor_Pc
, reserved "apple" >> return Vendor_Apple
, reserved "unknown" >> return Vendor_Unknown
, liftM Vendor_String pAnyString
]))
; os <- option Nothing (char '-' >> liftM Just
(choice [ reserved "linux" >> return Os_Linux
, reserved "windows" >> return Os_Windows
, reserved "win32" >> return Os_Win32
, reserved "mingw32" >> return Os_Mingw32
, reserved "unknown" >> return Os_Unknown
, reserved "darwin" >> liftM Os_Darwin pAnyString
, string "freebsd" >> liftM Os_FreeBsd pAnyString
, string "macosx" >> liftM Os_Macosx pAnyString
, string "ios" >> liftM Os_Ios pAnyString
, liftM Os_String pAnyString
]))
; env <- option Nothing (char '-' >> liftM Just (choice [ reserved "gnu" >> return OsEnv_Gnu
, liftM OsEnv_String pAnyString
]))
; return $ TargetTriple arch vendor os env
}
where
pAnyString :: P String
pAnyString = (manyTill anyChar (lookAhead $ choice [char '"', char '-']))