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

Portability | ghc
Stability | alpha
Maintainer | benedikt.huber@gmail.com
Safe Haskell | None

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
  - | 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
  - = InternalLinkage
  - | ExternalLinkage
- data Type
  - = DirectType TypeName TypeQuals
  - | PtrType Type TypeQuals Attributes
  - | ArrayType Type ArraySize TypeQuals Attributes
  - | FunctionType FunType
  - | TypeDefType TypeDefRef
  - | TypeOfExpr Expr
- data FunType
  - = FunType Type [ParamDecl] Bool Attributes
  - | FunTypeIncomplete Type Attributes
- isFunctionType :: Type -> Bool
- derefTypeDef :: Type -> Type
- referencedType :: Type -> Maybe Type
- hasTypeOfExpr :: Type -> Bool
- 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
- 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
- type AsmName = CStrLit
- data Attr = Attr Ident [Expr] NodeInfo
- type Attributes = [Attr]
- 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 |
Typeable TagDef |
Pos TagDef |
CNode TagDef |
Pretty TagDef |
HasSUERef 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 |
Typeable IdentDecl |
Pos IdentDecl |
CNode IdentDecl |
Pretty IdentDecl |
Declaration 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
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 |
Typeable Decl |
Pos Decl |
CNode Decl |
Pretty Decl |
Declaration 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 |
Typeable ObjDef |
Pos ObjDef |
CNode ObjDef |
Pretty ObjDef |
Declaration ObjDef |
Pretty (Either VarDecl 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 |
Typeable FunDef |
Pos FunDef |
CNode FunDef |
Pretty FunDef |
Declaration FunDef |
Pretty (Either VarDecl FunDef) |

data ParamDecl

Parameter declaration

Constructors

ParamDecl VarDecl NodeInfo |
AbstractParamDecl VarDecl NodeInfo |

Instances

Data ParamDecl |
Typeable ParamDecl |
Pos ParamDecl |
CNode ParamDecl |
Pretty ParamDecl |
Declaration 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 |
Typeable MemberDecl |
Pos MemberDecl |
CNode MemberDecl |
Pretty MemberDecl |
Declaration MemberDecl |

data TypeDef

`typedef` definitions.

The identifier is a new name for the given type.

Constructors

TypeDef Ident Type Attributes NodeInfo |

Instances

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

identOfTypeDef :: TypeDef -> Ident

return the idenitifier of a `typedef`

data VarDecl

Generic variable declarations

Constructors

VarDecl VarName DeclAttrs Type |

Instances

Data VarDecl |
Typeable VarDecl |
Pretty VarDecl |
Declaration VarDecl |
Pretty (Either VarDecl FunDef) |
Pretty (Either VarDecl ObjDef) |

# 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 |
Typeable DeclAttrs |
Pretty 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, with linkage and thread local specifier (gnu c)
FunLinkage Linkage | function, either internal or external linkage

Instances

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

declStorage :: Declaration d => d -> Storage

get the `Storage` of a declaration

type ThreadLocal = Bool

type Register = Bool

data Linkage

Linkage: Either internal to the translation unit or external

Constructors

InternalLinkage |
ExternalLinkage |

Instances

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

# Types

data Type

types of C objects

Constructors

DirectType TypeName TypeQuals | a non-derived type
PtrType Type TypeQuals Attributes | pointer type
ArrayType Type ArraySize TypeQuals Attributes | array type
FunctionType FunType | function type
TypeDefType TypeDefRef | a defined type
TypeOfExpr Expr | (GNU) typeof (broken and should be removed, but we do not yet have expression type analysis)

Instances

Data Type |
Typeable Type |
Pretty Type |

data FunType

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

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

Constructors

FunType Type [ParamDecl] Bool Attributes |
FunTypeIncomplete Type Attributes |

Instances

Data FunType |
Typeable FunType |

isFunctionType :: Type -> Bool

return `True` if the given type is a function type

Result is undefined in the presence of TypeOfExpr or undefined typeDefs

derefTypeDef :: Type -> Type

resolve typedefs, if possible

referencedType :: Type -> Maybe Type

hasTypeOfExpr :: Type -> Bool

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 |
Typeable TypeDefRef |
Pos TypeDefRef |
CNode 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)

Constructors

TyVaList |

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 |
Typeable CompTypeRef |
Pos CompTypeRef |
CNode CompTypeRef |
HasCompTyKind CompTypeRef |
HasSUERef CompTypeRef |

data CompType

Composite type (struct or union).

Constructors

CompType SUERef CompTyKind [MemberDecl] Attributes NodeInfo |

Instances

Data CompType |
Typeable CompType |
Pos CompType |
CNode CompType |
Pretty CompType |
HasCompTyKind CompType |
HasSUERef 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 |
Typeable CompTyKind |

data EnumTypeRef

Constructors

EnumTypeRef SUERef NodeInfo |

Instances

Data EnumTypeRef |
Typeable EnumTypeRef |
Pos EnumTypeRef |
CNode EnumTypeRef |
HasSUERef EnumTypeRef |

data EnumType

Representation of C enumeration types

Constructors

EnumType SUERef [Enumerator] Attributes NodeInfo

    EnumType name enumeration-constants attrs node

Instances

Data EnumType |
Typeable EnumType |
Pos EnumType |
CNode EnumType |
Pretty EnumType |
HasSUERef 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 |
Typeable Enumerator |
Pos Enumerator |
CNode Enumerator |
Pretty Enumerator |
Declaration Enumerator |

data TypeQuals

Type qualifiers: constant, volatile and restrict

Constructors

TypeQuals |

Fields

constant :: Bool
volatile :: Bool
restrict :: Bool

Instances

Data TypeQuals |
Typeable TypeQuals |
Pretty 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 |
Typeable VarName |
Pretty VarName |

identOfVarName :: VarName -> Ident

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 |
Typeable Attr |
Pos Attr |
CNode Attr |
Pretty Attributes |
Pretty Attr |

type Attributes = [Attr]

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