Portability | ghc |
---|---|
Stability | alpha |
Maintainer | benedikt.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.
- data TagDef
- 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
- objKindDescr :: IdentDecl -> String
- splitIdentDecls :: Bool -> Map Ident IdentDecl -> (Map Ident Decl, (Map Ident Enumerator, Map Ident ObjDef, Map Ident FunDef))
- data GlobalDecls = GlobalDecls {}
- emptyGlobalDecls :: GlobalDecls
- filterGlobalDecls :: (DeclEvent -> Bool) -> GlobalDecls -> GlobalDecls
- mergeGlobalDecls :: GlobalDecls -> GlobalDecls -> GlobalDecls
- data DeclEvent
- data Decl = Decl VarDecl NodeInfo
- data ObjDef = ObjDef VarDecl (Maybe Initializer) NodeInfo
- isTentative :: ObjDef -> Bool
- data FunDef = FunDef VarDecl Stmt NodeInfo
- data ParamDecl
- data MemberDecl
- 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
- declStorage :: Declaration d => d -> Storage
- type ThreadLocal = Bool
- type Register = Bool
- data Linkage
- data Type
- data FunType
- isFunctionType :: Type -> Bool
- derefTypeDef :: Type -> Type
- referencedType :: Type -> Maybe Type
- hasTypeOfExpr :: Type -> Bool
- data ArraySize
- data TypeDefRef = TypeDefRef Ident (Maybe Type) NodeInfo
- data TypeName
- data BuiltinType = TyVaList
- data IntType
- data FloatType
- class HasSUERef a where
- 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
- 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 {}
- noTypeQuals :: TypeQuals
- mergeTypeQuals :: TypeQuals -> TypeQuals -> TypeQuals
- data VarName
- 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)
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 | |
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.
Declarations and definitions
data Decl
Declarations, which aren't definitions
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).
data ParamDecl
Parameter declaration
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.
Constructors
TypeDef Ident Type Attributes NodeInfo |
identOfTypeDef :: TypeDef -> Ident
return the idenitifier of a typedef
data VarDecl
Generic variable declarations
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 |
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 |
declStorage :: Declaration d => d -> Storage
get the Storage
of a declaration
type ThreadLocal = Bool
data Linkage
Linkage: Either internal to the translation unit or external
Constructors
InternalLinkage | |
ExternalLinkage |
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) |
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 |
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 |
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
data IntType
integral types (C99 6.7.2.2)
data FloatType
floating point type (C99 6.7.2.2)
class HasSUERef a where
accessor class : struct/union/enum names
class HasCompTyKind a where
accessor class : composite type tags (struct or union)
Methods
compTag :: a -> CompTyKind
Instances
data CompType
Composite type (struct or union).
Constructors
CompType SUERef CompTyKind [MemberDecl] Attributes NodeInfo |
typeOfCompDef :: CompType -> TypeName
return the type of a composite type definition
data EnumTypeRef
Constructors
EnumTypeRef SUERef NodeInfo |
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
Constructors
Enumerator Ident Expr EnumType NodeInfo |
data TypeQuals
Type qualifiers: constant, volatile and restrict
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
identOfVarName :: VarName -> Ident
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
type Attributes = [Attr]
Statements and Expressions (STUB, aliases to 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