Language.C.Analysis.DeclAnalysis

language-c-0.5.0: Analysis and generation of C code

Copyright | (c) 2008 Benedikt Huber
License | BSD-style
Maintainer | benedikt.huber@gmail.com
Stability | alpha
Portability | ghc
Safe Haskell | None
Language | Haskell98

Language.C.Analysis.DeclAnalysis

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] -> 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
  - | BaseInt128
  - | 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
  - | 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 Type #

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 #

translate a type

tDirectType :: MonadTrav m => Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> m Type #

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) #

Mapping from num type specs to C types (C99 6.7.2-2), ignoring the complex qualifier.

tArraySize :: MonadTrav m => CArrSize -> m ArraySize #

tTypeQuals :: MonadTrav m => [CTypeQual] -> m (TypeQuals, Attributes) #

mergeOldStyle :: MonadCError m => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr] #

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 #

data NumBaseType #

Constructors

NoBaseType |
BaseChar |
BaseInt |
BaseInt128 |
BaseFloat |
BaseDouble |

Instances

Eq NumBaseType # |
Methods (==) :: NumBaseType -> NumBaseType -> Bool # (/=) :: NumBaseType -> NumBaseType -> Bool #
Ord NumBaseType # |
Methods compare :: NumBaseType -> NumBaseType -> Ordering # (<) :: NumBaseType -> NumBaseType -> Bool # (<=) :: NumBaseType -> NumBaseType -> Bool # (>) :: NumBaseType -> NumBaseType -> Bool # (>=) :: NumBaseType -> NumBaseType -> Bool # max :: NumBaseType -> NumBaseType -> NumBaseType # min :: NumBaseType -> NumBaseType -> NumBaseType #

data SignSpec #

Constructors

NoSignSpec |
Signed |
Unsigned |

Instances

Eq SignSpec # |
Methods (==) :: SignSpec -> SignSpec -> Bool # (/=) :: SignSpec -> SignSpec -> Bool #
Ord SignSpec # |
Methods compare :: SignSpec -> SignSpec -> Ordering # (<) :: SignSpec -> SignSpec -> Bool # (<=) :: SignSpec -> SignSpec -> Bool # (>) :: SignSpec -> SignSpec -> Bool # (>=) :: SignSpec -> SignSpec -> Bool # max :: SignSpec -> SignSpec -> SignSpec # min :: SignSpec -> SignSpec -> SignSpec #

data SizeMod #

Constructors

NoSizeMod |
ShortMod |
LongMod |
LongLongMod |

Instances

Eq SizeMod # |
Methods (==) :: SizeMod -> SizeMod -> Bool # (/=) :: SizeMod -> SizeMod -> Bool #
Ord SizeMod # |
Methods compare :: SizeMod -> SizeMod -> Ordering # (<) :: SizeMod -> SizeMod -> Bool # (<=) :: SizeMod -> SizeMod -> Bool # (>) :: SizeMod -> SizeMod -> Bool # (>=) :: SizeMod -> SizeMod -> Bool # max :: SizeMod -> SizeMod -> SizeMod # min :: SizeMod -> SizeMod -> SizeMod #

data NumTypeSpec #

Constructors

NumTypeSpec |
Fields base :: NumBaseType signSpec :: SignSpec sizeMod :: SizeMod isComplex :: Bool

data TypeSpecAnalysis #

Constructors

TSNone |
TSVoid |
TSBool |
TSNum NumTypeSpec |
TSTypeDef TypeDefRef |
TSType Type |
TSNonBasic CTypeSpec |

canonicalStorageSpec :: MonadCError m => [CStorageSpec] -> m StorageSpec #

data StorageSpec #

Constructors

NoStorageSpec |
AutoSpec |
RegSpec |
ThreadSpec |
StaticSpec Bool |
ExternSpec Bool |

Instances

Eq StorageSpec # |
Methods (==) :: StorageSpec -> StorageSpec -> Bool # (/=) :: StorageSpec -> StorageSpec -> Bool #
Ord StorageSpec # |
Methods compare :: StorageSpec -> StorageSpec -> Ordering # (<) :: StorageSpec -> StorageSpec -> Bool # (<=) :: StorageSpec -> StorageSpec -> Bool # (>) :: StorageSpec -> StorageSpec -> Bool # (>=) :: StorageSpec -> StorageSpec -> Bool # max :: StorageSpec -> StorageSpec -> StorageSpec # min :: StorageSpec -> StorageSpec -> StorageSpec #
Read StorageSpec # |
Methods readsPrec :: Int -> ReadS StorageSpec # readList :: ReadS [StorageSpec] # readPrec :: ReadPrec StorageSpec # readListPrec :: ReadPrec [StorageSpec] #
Show StorageSpec # |
Methods showsPrec :: Int -> StorageSpec -> ShowS # show :: StorageSpec -> String # showList :: [StorageSpec] -> ShowS #

hasThreadLocalSpec :: StorageSpec -> Bool #

isTypeDef :: [CDeclSpec] -> Bool #

# Helpers

data VarDeclInfo #

Constructors

VarDeclInfo VarName Bool StorageSpec Attributes Type NodeInfo |

tAttr :: (MonadCError m, MonadSymtab m) => CAttr -> m Attr #

translate `attribute` annotations TODO: This is a unwrap and wrap stub

mkVarName :: (MonadCError m, MonadSymtab m) => NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName #

construct a name for a variable TODO: more or less bogus

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 #

analyse declarators

analyseVarDecl' :: MonadTrav m => Bool -> [CDeclSpec] -> CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfo #