Copyright | (c) 2008 Benedikt Huber |
---|---|
License | BSD-style |
Maintainer | benedikt.huber@gmail.com |
Stability | alpha |
Portability | ghc |
Safe Haskell | None |
Language | Haskell98 |
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
- data SignSpec
- = NoSignSpec
- | Signed
- | Unsigned
- data SizeMod
- data NumTypeSpec = NumTypeSpec {}
- data TypeSpecAnalysis
- canonicalStorageSpec :: MonadCError m => [CStorageSpec] -> m StorageSpec
- data StorageSpec
- 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 Type Source
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 Type Source
translate a type
tDirectType :: MonadTrav m => Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> m Type Source
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 ArraySize Source
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 TypeSpecAnalysis Source
data NumBaseType Source
data TypeSpecAnalysis Source
canonicalStorageSpec :: MonadCError m => [CStorageSpec] -> m StorageSpec Source
data StorageSpec Source
Helpers
tAttr :: (MonadCError m, MonadSymtab m) => CAttr -> m Attr Source
translate attribute
annotations
TODO: This is a unwrap and wrap stub
mkVarName :: (MonadCError m, MonadSymtab m) => NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName Source
construct a name for a variable TODO: more or less bogus
getOnlyDeclr :: MonadCError m => CDecl -> m CDeclr Source
nameOfDecl :: MonadCError m => CDecl -> m Ident Source
analyseVarDecl :: MonadTrav m => Bool -> [CStorageSpec] -> [CAttr] -> [CTypeQual] -> TypeSpecAnalysis -> Bool -> CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfo Source
analyse declarators
analyseVarDecl' :: MonadTrav m => Bool -> [CDeclSpec] -> CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfo Source