Portability | ghc |
---|---|
Stability | alpha |
Maintainer | jwlato@gmail.com |
Safe Haskell | None |
This module performs the analysis of declarations and the translation of type specifications in the AST.
- analyseTypeDecl :: MonadTrav m => CDecl -> m Type
- tType :: MonadTrav m => Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> [CDerivedDeclr] -> [CDecl] -> m Type
- tDirectType :: MonadTrav m => Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> m Type
- tNumType :: MonadCError m => NumTypeSpec -> m (Either (FloatType, Bool) IntType)
- tArraySize :: MonadTrav m => CArrSize -> m ArraySize
- tTypeQuals :: MonadTrav m => [CTypeQual] -> m (TypeQuals, Attributes)
- mergeOldStyle :: MonadCError m => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr]
- canonicalTypeSpec :: MonadTrav m => [CTypeSpec] -> m TypeSpecAnalysis
- data NumBaseType
- = NoBaseType
- | BaseChar
- | BaseInt
- | BaseFloat
- | BaseDouble
- data SignSpec
- = NoSignSpec
- | Signed
- | Unsigned
- data SizeMod
- = NoSizeMod
- | ShortMod
- | LongMod
- | LongLongMod
- data NumTypeSpec = NumTypeSpec {}
- data TypeSpecAnalysis
- = TSNone
- | TSVoid
- | TSBool
- | TSNum NumTypeSpec
- | TSTypeDef TypeDefRef
- | TSType Type
- | TSNonBasic CTypeSpec
- canonicalStorageSpec :: MonadCError m => [CStorageSpec] -> m StorageSpec
- data StorageSpec
- = NoStorageSpec
- | AutoSpec
- | RegSpec
- | ThreadSpec
- | StaticSpec Bool
- | ExternSpec Bool
- hasThreadLocalSpec :: StorageSpec -> Bool
- isTypeDef :: [CDeclSpec] -> Bool
- data VarDeclInfo = VarDeclInfo VarName Bool StorageSpec Attributes Type NodeInfo
- tAttr :: (MonadCError m, MonadSymtab m) => CAttr -> m Attr
- mkVarName :: (MonadCError m, MonadSymtab m) => NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName
- getOnlyDeclr :: MonadCError m => CDecl -> m CDeclr
- nameOfDecl :: MonadCError m => CDecl -> m Ident
- analyseVarDecl :: MonadTrav m => Bool -> [CStorageSpec] -> [CAttr] -> [CTypeQual] -> TypeSpecAnalysis -> Bool -> CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfo
- analyseVarDecl' :: MonadTrav m => Bool -> [CDeclSpec] -> CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfo
Translating types
analyseTypeDecl :: MonadTrav m => CDecl -> m TypeSource
get the type of a type declaration
A type declaration T
may appear in thre forms:
typeof(T)
- as abstract declarator in a function prototype, as in
f(int)
- in a declaration without declarators, as in
struct x { int a } ;
Currently, analyseTypeDecl
is exlusively used for analysing types for GNU's typeof(T)
.
We move attributes to the type, as they have no meaning for the abstract declarator
tType :: MonadTrav m => Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> [CDerivedDeclr] -> [CDecl] -> m TypeSource
translate a type
tDirectType :: MonadTrav m => Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> m TypeSource
translate a type without (syntactic) indirections
Due to the GNU typeof
extension and typeDefs, this can be an arbitrary type
tNumType :: MonadCError m => NumTypeSpec -> m (Either (FloatType, Bool) IntType)Source
Mapping from num type specs to C types (C99 6.7.2-2), ignoring the complex qualifier.
tArraySize :: MonadTrav m => CArrSize -> m ArraySizeSource
tTypeQuals :: MonadTrav m => [CTypeQual] -> m (TypeQuals, Attributes)Source
mergeOldStyle :: MonadCError m => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr]Source
convert old style parameters
This requires matching parameter names and declarations, as in the following example:
int f(d,c,a,b) char a,*b; int c; { }
is converted to
int f(int d, int c, char a, char* b)
TODO: This could be moved to syntax, as it operates on the AST only
Dissecting type specs
canonicalTypeSpec :: MonadTrav m => [CTypeSpec] -> m TypeSpecAnalysisSource
data NumBaseType Source
data TypeSpecAnalysis Source
canonicalStorageSpec :: MonadCError m => [CStorageSpec] -> m StorageSpecSource
data StorageSpec Source
Helpers
tAttr :: (MonadCError m, MonadSymtab m) => CAttr -> m AttrSource
translate __attribute__
annotations
TODO: This is a unwrap and wrap stub
mkVarName :: (MonadCError m, MonadSymtab m) => NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarNameSource
construct a name for a variable TODO: more or less bogus
getOnlyDeclr :: MonadCError m => CDecl -> m CDeclrSource
nameOfDecl :: MonadCError m => CDecl -> m IdentSource
:: MonadTrav m | |
=> Bool | |
-> [CStorageSpec] | |
-> [CAttr] | |
-> [CTypeQual] | |
-> TypeSpecAnalysis | |
-> Bool | |
-> CDeclr | |
-> [CDecl] | |
-> Maybe CInit | currently unused |
-> m VarDeclInfo |
analyse declarators
analyseVarDecl' :: MonadTrav m => Bool -> [CDeclSpec] -> CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfoSource