language-c-0.3.1.1: Analysis and generation of C codeSource codeContentsIndex
Language.C.Analysis.DeclAnalysis
Portabilityghc
Stabilityalpha
Maintainerbenedikt.huber@gmail.com
Contents
Translating types
Dissecting type specs
Helpers
Description
This module performs the analysis of declarations and the translation of type specifications in the AST.
Synopsis
analyseTypeDecl :: MonadTrav m => CDecl -> m Type
tType :: MonadTrav m => Bool -> NodeInfo -> [CTypeQual] -> [CTypeSpec] -> [CDerivedDeclr] -> [CDecl] -> m Type
tDirectType :: MonadTrav m => Bool -> NodeInfo -> [CTypeQual] -> [CTypeSpec] -> m Type
tNumType :: MonadTrav m => NumTypeSpec -> m (Either (FloatType, Bool) IntType)
tArraySize :: MonadTrav m => CArrSize -> m ArraySize
tTypeQuals :: MonadTrav m => [CTypeQual] -> m (TypeQuals, Attributes)
mergeOldStyle :: MonadTrav 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 {
base :: NumBaseType
signSpec :: SignSpec
sizeMod :: SizeMod
isComplex :: Bool
}
data TypeSpecAnalysis
= TSNone
| TSVoid
| TSBool
| TSNum NumTypeSpec
| TSNonBasic CTypeSpec
canonicalStorageSpec :: MonadTrav m => [CStorageSpec] -> m StorageSpec
data StorageSpec
= NoStorageSpec
| AutoSpec
| RegSpec
| ThreadSpec
| StaticSpec Bool
| ExternSpec Bool
hasThreadLocalSpec :: StorageSpec -> Bool
data VarDeclInfo = VarDeclInfo VarName Bool StorageSpec Attributes Type NodeInfo
tAttr :: MonadTrav m => CAttr -> m Attr
mkVarName :: MonadTrav m => NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName
getOnlyDeclr :: MonadTrav m => CDecl -> m CDeclr
nameOfDecl :: MonadTrav m => CDecl -> m Ident
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] -> [CTypeSpec] -> [CDerivedDeclr] -> [CDecl] -> m TypeSource
translate a type
tDirectType :: MonadTrav m => Bool -> NodeInfo -> [CTypeQual] -> [CTypeSpec] -> m TypeSource
translate a type without (syntactic) indirections Due to the GNU typeof extension and typeDefs, this can be an arbitrary type
tNumType :: MonadTrav 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 :: MonadTrav 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
Constructors
NoBaseType
BaseChar
BaseInt
BaseFloat
BaseDouble
data SignSpec Source
Constructors
NoSignSpec
Signed
Unsigned
data SizeMod Source
Constructors
NoSizeMod
ShortMod
LongMod
LongLongMod
data NumTypeSpec Source
Constructors
NumTypeSpec
base :: NumBaseType
signSpec :: SignSpec
sizeMod :: SizeMod
isComplex :: Bool
data TypeSpecAnalysis Source
Constructors
TSNone
TSVoid
TSBool
TSNum NumTypeSpec
TSNonBasic CTypeSpec
canonicalStorageSpec :: MonadTrav m => [CStorageSpec] -> m StorageSpecSource
data StorageSpec Source
Constructors
NoStorageSpec
AutoSpec
RegSpec
ThreadSpec
StaticSpec Bool
ExternSpec Bool
hasThreadLocalSpec :: StorageSpec -> BoolSource
Helpers
data VarDeclInfo Source
Constructors
VarDeclInfo VarName Bool StorageSpec Attributes Type NodeInfo
tAttr :: MonadTrav m => CAttr -> m AttrSource
translate __attribute__ annotations TODO: This is a unwrap and wrap stub
mkVarName :: MonadTrav m => NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarNameSource
construct a name for a variable TODO: more or less bogus
getOnlyDeclr :: MonadTrav m => CDecl -> m CDeclrSource
nameOfDecl :: MonadTrav m => CDecl -> m IdentSource
Produced by Haddock version 2.6.0