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

Portabilityghc
Stabilityalpha
Maintainerbenedikt.huber@gmail.com

Language.C.Analysis.SemRep

Contents

Description

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

Synopsis

Sums of tags and identifiers

data TagDef

Composite type definitions (tags)

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

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

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

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

Declarations and definitions

data Decl

Declarations, which aren't definitions

Constructors

Decl VarDecl NodeInfo 

Instances

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 

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 

data MemberDecl

Struct/Union member declaration

Constructors

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

data TypeDef

typedef definitions.

The identifier is a new name for the given type.

Instances

identOfTypeDef :: TypeDef -> Ident

return the idenitifier of a typedef

data VarDecl

Generic variable declarations

Instances

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

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

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.

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

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 TypeName

normalized type representation

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)

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

class HasCompTyKind a where

accessor class : composite type tags (struct or union)

Methods

compTag :: a -> CompTyKind

data CompType

Composite type (struct or union).

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 EnumType

Representation of C enumeration types

Constructors

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

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

data TypeQuals

Type qualifiers: constant, volatile and restrict

Constructors

TypeQuals 

Fields

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

Instances

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 

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