Language.C.Analysis.SemRep

language-c-0.4.5: 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.SemRep

Contents

- Sums of tags and identifiers
- Global definitions
- Events for visitors
- Declarations and definitions
- Declaration attributes
- Types
- Variable names
- Attributes (STUB, not yet analyzed)
- Statements and Expressions (STUB, aliases to Syntax)

Description

This module contains definitions for representing C translation units. In contrast to `AST`, the representation tries to express the semantics of of a translation unit.

Synopsis

- data TagDef
  - = CompDef CompType
  - | EnumDef EnumType
- typeOfTagDef :: TagDef -> TypeName
- class Declaration n where
  - getVarDecl :: n -> VarDecl
- declIdent :: Declaration n => n -> Ident
- declName :: Declaration n => n -> VarName
- declType :: Declaration n => n -> Type
- declAttrs :: Declaration n => n -> DeclAttrs
- data IdentDecl
  - = Declaration Decl
  - | ObjectDef ObjDef
  - | FunctionDef FunDef
  - | EnumeratorDef Enumerator
- objKindDescr :: IdentDecl -> String
- splitIdentDecls :: Bool -> Map Ident IdentDecl -> (Map Ident Decl, (Map Ident Enumerator, Map Ident ObjDef, Map Ident FunDef))
- data GlobalDecls = GlobalDecls {
  - gObjs :: Map Ident IdentDecl
  - gTags :: Map SUERef TagDef
  - gTypeDefs :: Map Ident TypeDef
  }
- emptyGlobalDecls :: GlobalDecls
- filterGlobalDecls :: (DeclEvent -> Bool) -> GlobalDecls -> GlobalDecls
- mergeGlobalDecls :: GlobalDecls -> GlobalDecls -> GlobalDecls
- data DeclEvent
  - = TagEvent TagDef
  - | DeclEvent IdentDecl
  - | ParamEvent ParamDecl
  - | LocalEvent IdentDecl
  - | TypeDefEvent TypeDef
  - | AsmEvent AsmBlock
- data Decl = Decl VarDecl NodeInfo
- data ObjDef = ObjDef VarDecl (Maybe Initializer) NodeInfo
- isTentative :: ObjDef -> Bool
- data FunDef = FunDef VarDecl Stmt NodeInfo
- data ParamDecl
  - = ParamDecl VarDecl NodeInfo
  - | AbstractParamDecl VarDecl NodeInfo
- data MemberDecl
  - = MemberDecl VarDecl (Maybe Expr) NodeInfo
  - | AnonBitField Type Expr NodeInfo
- data TypeDef = TypeDef Ident Type Attributes NodeInfo
- identOfTypeDef :: TypeDef -> Ident
- data VarDecl = VarDecl VarName DeclAttrs Type
- data DeclAttrs = DeclAttrs Bool Storage Attributes
- isExtDecl :: Declaration n => n -> Bool
- data Storage
  - = NoStorage
  - | Auto Register
  - | Static Linkage ThreadLocal
  - | FunLinkage Linkage
- declStorage :: Declaration d => d -> Storage
- type ThreadLocal = Bool
- type Register = Bool
- data Linkage
  - = NoLinkage
  - | InternalLinkage
  - | ExternalLinkage
- hasLinkage :: Storage -> Bool
- declLinkage :: Declaration d => d -> Linkage
- data Type
  - = DirectType TypeName TypeQuals Attributes
  - | PtrType Type TypeQuals Attributes
  - | ArrayType Type ArraySize TypeQuals Attributes
  - | FunctionType FunType Attributes
  - | TypeDefType TypeDefRef TypeQuals Attributes
- data FunType
  - = FunType Type [ParamDecl] Bool
  - | FunTypeIncomplete Type
- data ArraySize
  - = UnknownArraySize Bool
  - | ArraySize Bool Expr
- data TypeDefRef = TypeDefRef Ident (Maybe Type) NodeInfo
- data TypeName
  - = TyVoid
  - | TyIntegral IntType
  - | TyFloating FloatType
  - | TyComplex FloatType
  - | TyComp CompTypeRef
  - | TyEnum EnumTypeRef
  - | TyBuiltin BuiltinType
- data BuiltinType
  - = TyVaList
  - | TyAny
- data IntType
  - = TyBool
  - | TyChar
  - | TySChar
  - | TyUChar
  - | TyShort
  - | TyUShort
  - | TyInt
  - | TyUInt
  - | TyLong
  - | TyULong
  - | TyLLong
  - | TyULLong
- data FloatType
  - = TyFloat
  - | TyDouble
  - | TyLDouble
- class HasSUERef a where
  - sueRef :: a -> SUERef
- class HasCompTyKind a where
  - compTag :: a -> CompTyKind
- data CompTypeRef = CompTypeRef SUERef CompTyKind NodeInfo
- data CompType = CompType SUERef CompTyKind [MemberDecl] Attributes NodeInfo
- typeOfCompDef :: CompType -> TypeName
- data CompTyKind
  - = StructTag
  - | UnionTag
- data EnumTypeRef = EnumTypeRef SUERef NodeInfo
- data EnumType = EnumType SUERef [Enumerator] Attributes NodeInfo
- typeOfEnumDef :: EnumType -> TypeName
- data Enumerator = Enumerator Ident Expr EnumType NodeInfo
- data TypeQuals = TypeQuals {
  - constant :: Bool
  - volatile :: Bool
  - restrict :: Bool
  }
- noTypeQuals :: TypeQuals
- mergeTypeQuals :: TypeQuals -> TypeQuals -> TypeQuals
- data VarName
  - = VarName Ident (Maybe AsmName)
  - | NoName
- identOfVarName :: VarName -> Ident
- isNoName :: VarName -> Bool
- type AsmName = CStrLit
- data Attr = Attr Ident [Expr] NodeInfo
- type Attributes = [Attr]
- noAttributes :: Attributes
- mergeAttributes :: Attributes -> Attributes -> Attributes
- type Stmt = CStat
- type Expr = CExpr
- type Initializer = CInit
- type AsmBlock = CStrLit

# Sums of tags and identifiers

data TagDef

Composite type definitions (tags)

Constructors

CompDef CompType |
EnumDef EnumType |

Instances

Data TagDef |
Pos TagDef |
CNode TagDef |
Pretty TagDef |
HasSUERef TagDef |
Typeable * TagDef |

typeOfTagDef :: TagDef -> TypeName

return the type corresponding to a tag definition

class Declaration n where

All datatypes aggregating a declaration are instances of `Declaration`

Methods

getVarDecl :: n -> VarDecl

get the name, type and declaration attributes of a declaration or definition

Instances

Declaration Enumerator |
Declaration VarDecl |
Declaration MemberDecl |
Declaration ParamDecl |
Declaration FunDef |
Declaration ObjDef |
Declaration Decl |
Declaration IdentDecl |
(Declaration a, Declaration b) => Declaration (Either a b) |

declIdent :: Declaration n => n -> Ident

get the variable identifier of a declaration (only safe if the the declaration is known to have a name)

declName :: Declaration n => n -> VarName

get the variable name of a `Declaration`

declType :: Declaration n => n -> Type

get the type of a `Declaration`

declAttrs :: Declaration n => n -> DeclAttrs

get the declaration attributes of a `Declaration`

data IdentDecl

identifiers, typedefs and enumeration constants (namespace sum)

Constructors

Declaration Decl | object or function declaration
ObjectDef ObjDef | object definition
FunctionDef FunDef | function definition
EnumeratorDef Enumerator | definition of an enumerator

Instances

Data IdentDecl |
Pos IdentDecl |
CNode IdentDecl |
Pretty IdentDecl |
Declaration IdentDecl |
Typeable * IdentDecl |

objKindDescr :: IdentDecl -> String

textual description of the kind of an object

splitIdentDecls :: Bool -> Map Ident IdentDecl -> (Map Ident Decl, (Map Ident Enumerator, Map Ident ObjDef, Map Ident FunDef))

`splitIdentDecls includeAllDecls` splits a map of object, function and enumerator declarations and definitions into one map holding declarations, and three maps for object definitions, enumerator definitions and function definitions. If `includeAllDecls` is `True` all declarations are present in the first map, otherwise only those where no corresponding definition is available.

# Global definitions

data GlobalDecls

global declaration/definition table returned by the analysis

Constructors

GlobalDecls |
Fields gObjs :: Map Ident IdentDecl gTags :: Map SUERef TagDef gTypeDefs :: Map Ident TypeDef

Instances

Pretty GlobalDecls |

emptyGlobalDecls :: GlobalDecls

empty global declaration table

filterGlobalDecls :: (DeclEvent -> Bool) -> GlobalDecls -> GlobalDecls

filter global declarations

mergeGlobalDecls :: GlobalDecls -> GlobalDecls -> GlobalDecls

merge global declarations

# Events for visitors

data DeclEvent

Declaration events

Those events are reported to callbacks, which are executed during the traversal.

Constructors

TagEvent TagDef | file-scope struct/union/enum event
DeclEvent IdentDecl | file-scope declaration or definition
ParamEvent ParamDecl | parameter declaration
LocalEvent IdentDecl | local variable declaration or definition
TypeDefEvent TypeDef | a type definition
AsmEvent AsmBlock | assembler block

Instances

Pos DeclEvent |
CNode DeclEvent |

# Declarations and definitions

data Decl

Declarations, which aren't definitions

Constructors

Decl VarDecl NodeInfo |

Instances

Data Decl |
Pos Decl |
CNode Decl |
Pretty Decl |
Declaration Decl |
Typeable * Decl |

data ObjDef

Object Definitions

An object definition is a declaration together with an initializer.

If the initializer is missing, it is a tentative definition, i.e. a definition which might be overriden later on.

Constructors

ObjDef VarDecl (Maybe Initializer) NodeInfo |

Instances

Data ObjDef |
Pos ObjDef |
CNode ObjDef |
Pretty ObjDef |
Declaration ObjDef |
Typeable * ObjDef |

isTentative :: ObjDef -> Bool

Returns `True` if the given object definition is tentative.

data FunDef

Function definitions

A function definition is a declaration together with a statement (the function body).

Constructors

FunDef VarDecl Stmt NodeInfo |

Instances

Data FunDef |
Pos FunDef |
CNode FunDef |
Pretty FunDef |
Declaration FunDef |
Typeable * FunDef |

data ParamDecl

Parameter declaration

Constructors

ParamDecl VarDecl NodeInfo |
AbstractParamDecl VarDecl NodeInfo |

Instances

Data ParamDecl |
Pos ParamDecl |
CNode ParamDecl |
Pretty ParamDecl |
Declaration ParamDecl |
Typeable * ParamDecl |

data MemberDecl

Struct/Union member declaration

Constructors

MemberDecl VarDecl (Maybe Expr) NodeInfo |
    MemberDecl vardecl bitfieldsize node
AnonBitField Type Expr NodeInfo |
    AnonBitField typ size

Instances

Data MemberDecl |
Pos MemberDecl |
CNode MemberDecl |
Pretty MemberDecl |
Declaration MemberDecl |
Typeable * MemberDecl |

data TypeDef

`typedef` definitions.

The identifier is a new name for the given type.

Constructors

TypeDef Ident Type Attributes NodeInfo |

Instances

Data TypeDef |
Pos TypeDef |
CNode TypeDef |
Pretty TypeDef |
Typeable * TypeDef |

identOfTypeDef :: TypeDef -> Ident

return the idenitifier of a `typedef`

data VarDecl

Generic variable declarations

Constructors

VarDecl VarName DeclAttrs Type |

Instances

Data VarDecl |
Pretty VarDecl |
Declaration VarDecl |
Typeable * VarDecl |

# Declaration attributes

data DeclAttrs

Declaration attributes of the form `DeclAttrs isInlineFunction storage linkage attrs`

They specify the storage and linkage of a declared object.

Constructors

DeclAttrs Bool Storage Attributes |
    DeclAttrs inline storage attrs

Instances

Data DeclAttrs |
Pretty DeclAttrs |
Typeable * DeclAttrs |

isExtDecl :: Declaration n => n -> Bool

data Storage

Storage duration and linkage of a variable

Constructors

NoStorage | no storage
Auto Register | automatic storage (optional: register)
Static Linkage ThreadLocal | static storage, linkage spec and thread local specifier (gnu c)
FunLinkage Linkage | function, either internal or external linkage

Instances

Eq Storage |
Data Storage |
Ord Storage |
Show Storage |
Pretty Storage |
Typeable * Storage |

declStorage :: Declaration d => d -> Storage

get the `Storage` of a declaration

type ThreadLocal = Bool

type Register = Bool

data Linkage

Linkage: Either no linkage, internal to the translation unit or external

Constructors

NoLinkage |
InternalLinkage |
ExternalLinkage |

Instances

Eq Linkage |
Data Linkage |
Ord Linkage |
Show Linkage |
Pretty Linkage |
Typeable * Linkage |

hasLinkage :: Storage -> Bool

return `True` if the object has linkage

declLinkage :: Declaration d => d -> Linkage

Get the linkage of a definition

# Types

data Type

types of C objects

Constructors

DirectType TypeName TypeQuals Attributes | a non-derived type
PtrType Type TypeQuals Attributes | pointer type
ArrayType Type ArraySize TypeQuals Attributes | array type
FunctionType FunType Attributes | function type
TypeDefType TypeDefRef TypeQuals Attributes | a defined type

Instances

Data Type |
Pretty Type |
Typeable * Type |

data FunType

Function types are of the form `FunType return-type params isVariadic`.

If the parameter types aren't yet known, the function has type `FunTypeIncomplete type attrs`.

Constructors

FunType Type [ParamDecl] Bool |
FunTypeIncomplete Type |

Instances

Data FunType |
Typeable * FunType |

data ArraySize

An array type may either have unknown size or a specified array size, the latter either variable or constant. Furthermore, when used as a function parameters, the size may be qualified as static. In a function prototype, the size may be `Unspecified variable size' (`[*]`).

Constructors

UnknownArraySize Bool |
    UnknownArraySize is-starred
ArraySize Bool Expr |
    FixedSizeArray is-static size-expr

Instances

Data ArraySize |
Typeable * ArraySize |

data TypeDefRef

typdef references If the actual type is known, it is attached for convenience

Constructors

TypeDefRef Ident (Maybe Type) NodeInfo |

Instances

Data TypeDefRef |
Pos TypeDefRef |
CNode TypeDefRef |
Typeable * TypeDefRef |

data TypeName

normalized type representation

Constructors

TyVoid |
TyIntegral IntType |
TyFloating FloatType |
TyComplex FloatType |
TyComp CompTypeRef |
TyEnum EnumTypeRef |
TyBuiltin BuiltinType |

Instances

Data TypeName |
Typeable * TypeName |

data BuiltinType

Builtin type (va_list, anything)

Constructors

TyVaList |
TyAny |

Instances

Data BuiltinType |
Typeable * BuiltinType |

data IntType

integral types (C99 6.7.2.2)

Constructors

TyBool |
TyChar |
TySChar |
TyUChar |
TyShort |
TyUShort |
TyInt |
TyUInt |
TyLong |
TyULong |
TyLLong |
TyULLong |

Instances

Eq IntType |
Data IntType |
Ord IntType |
Show IntType |
Typeable * IntType |

data FloatType

floating point type (C99 6.7.2.2)

Constructors

TyFloat |
TyDouble |
TyLDouble |

Instances

Eq FloatType |
Data FloatType |
Ord FloatType |
Show FloatType |
Typeable * FloatType |

class HasSUERef a where

accessor class : struct/union/enum names

Methods

sueRef :: a -> SUERef

Instances

HasSUERef EnumType |
HasSUERef CompType |
HasSUERef EnumTypeRef |
HasSUERef CompTypeRef |
HasSUERef TagDef |
HasSUERef TagFwdDecl |

class HasCompTyKind a where

accessor class : composite type tags (struct or union)

Methods

compTag :: a -> CompTyKind

Instances

HasCompTyKind CompType |
HasCompTyKind CompTypeRef |

data CompTypeRef

composite type declarations

Constructors

CompTypeRef SUERef CompTyKind NodeInfo |

Instances

Data CompTypeRef |
Pos CompTypeRef |
CNode CompTypeRef |
Pretty CompTypeRef |
HasCompTyKind CompTypeRef |
HasSUERef CompTypeRef |
Typeable * CompTypeRef |

data CompType

Composite type (struct or union).

Constructors

CompType SUERef CompTyKind [MemberDecl] Attributes NodeInfo |

Instances

Data CompType |
Pos CompType |
CNode CompType |
Pretty CompType |
HasCompTyKind CompType |
HasSUERef CompType |
Typeable * CompType |

typeOfCompDef :: CompType -> TypeName

return the type of a composite type definition

data CompTyKind

a tag to determine wheter we refer to a `struct` or `union`, see `CompType`.

Constructors

StructTag |
UnionTag |

Instances

Eq CompTyKind |
Data CompTyKind |
Ord CompTyKind |
Show CompTyKind |
Pretty CompTyKind |
Typeable * CompTyKind |

data EnumTypeRef

Constructors

EnumTypeRef SUERef NodeInfo |

Instances

Data EnumTypeRef |
Pos EnumTypeRef |
CNode EnumTypeRef |
Pretty EnumTypeRef |
HasSUERef EnumTypeRef |
Typeable * EnumTypeRef |

data EnumType

Representation of C enumeration types

Constructors

EnumType SUERef [Enumerator] Attributes NodeInfo |
    EnumType name enumeration-constants attrs node

Instances

Data EnumType |
Pos EnumType |
CNode EnumType |
Pretty EnumType |
HasSUERef EnumType |
Typeable * EnumType |

typeOfEnumDef :: EnumType -> TypeName

return the type of an enum definition

data Enumerator

An Enumerator consists of an identifier, a constant expressions and the link to its type

Constructors

Enumerator Ident Expr EnumType NodeInfo |

Instances

Data Enumerator |
Pos Enumerator |
CNode Enumerator |
Pretty Enumerator |
Declaration Enumerator |
Typeable * Enumerator |

data TypeQuals

Type qualifiers: constant, volatile and restrict

Constructors

TypeQuals |
Fields constant :: Bool volatile :: Bool restrict :: Bool

Instances

Eq TypeQuals |
Data TypeQuals |
Ord TypeQuals |
Pretty TypeQuals |
Typeable * TypeQuals |

noTypeQuals :: TypeQuals

no type qualifiers

mergeTypeQuals :: TypeQuals -> TypeQuals -> TypeQuals

merge (&&) two type qualifier sets

# Variable names

data VarName

`VarName name assembler-name` is a name of an declared object

Constructors

VarName Ident (Maybe AsmName) |
NoName |

Instances

Data VarName |
Pretty VarName |
Typeable * VarName |

identOfVarName :: VarName -> Ident

isNoName :: VarName -> Bool

type AsmName = CStrLit

Assembler name (alias for `CStrLit`)

# Attributes (STUB, not yet analyzed)

data Attr

`attribute` annotations

Those are of the form `Attr attribute-name attribute-parameters`, and serve as generic properties of some syntax tree elements.

Some examples:

- labels can be attributed with unused to indicate that their not used
- struct definitions can be attributed with packed to tell the compiler to use the most compact representation
- declarations can be attributed with deprecated
- function declarations can be attributes with noreturn to tell the compiler that the function will never return,
- or with const to indicate that it is a pure function

TODO: ultimatively, we want to parse attributes and represent them in a typed way

Constructors

Attr Ident [Expr] NodeInfo |

Instances

Data Attr |
Pos Attr |
CNode Attr |
Pretty Attributes |
Pretty Attr |
Typeable * Attr |

type Attributes = [Attr]

noAttributes :: Attributes

Empty attribute list

mergeAttributes :: Attributes -> Attributes -> Attributes

Merge attribute lists TODO: currently does not remove duplicates

# Statements and Expressions (STUB, aliases to Syntax)

type Stmt = CStat

`Stmt` is an alias for `CStat` (Syntax)

type Expr = CExpr

`Expr` is currently an alias for `CExpr` (Syntax)

type Initializer = CInit

`Initializer` is currently an alias for `CInit`.

We're planning a normalized representation, but this depends on the implementation of constant expression evaluation

type AsmBlock = CStrLit

Top level assembler block (alias for `CStrLit`)