view ir/irstruct.h @ 302:bef811104734 trunk

[svn r323] Branching out of inline asm works. Renamed emit_finallyblocks to DtoFinallyBlocks and moved to llvmhelpers. Added enclosingtryfinally to AsmBlockStatement, so branches out of asm blocks respect finallys. Refactored some GotoStatement code into DtoGoto.
author ChristianK
date Wed, 25 Jun 2008 20:39:09 +0200
parents e3355ce5444b
children 7ade5e035beb
line wrap: on
line source

#ifndef LLVMDC_IR_IRSTRUCT_H
#define LLVMDC_IR_IRSTRUCT_H

#include "ir/ir.h"

#include <vector>
#include <map>

struct IrInterface : IrBase
{
    BaseClass* base;
    ClassDeclaration* decl;

#if OPAQUE_VTBLS
    const LLArrayType* vtblTy;
    LLConstantArray* vtblInit;
#else
    const LLStructType* vtblTy;
    LLConstantStruct* vtblInit;
#endif
    LLGlobalVariable* vtbl;

    const LLStructType* infoTy;
    LLConstantStruct* infoInit;
    LLConstant* info;

    int index;

#if OPAQUE_VTBLS
    IrInterface(BaseClass* b, const LLArrayType* vt);
#else
    IrInterface(BaseClass* b, const LLStructType* vt);
#endif
    ~IrInterface();
};

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

// represents a struct or class
struct IrStruct : IrBase
{
    struct Offset
    {
        VarDeclaration* var;
        const LLType* type;
        LLConstant* init;

        Offset(VarDeclaration* v, const LLType* ty)
        : var(v), type(ty), init(NULL) {}
    };

    typedef std::multimap<unsigned, Offset> OffsetMap;
    typedef std::vector<VarDeclaration*> VarDeclVector;
    typedef std::map<ClassDeclaration*, IrInterface*> InterfaceMap;
    typedef InterfaceMap::iterator InterfaceMapIter;
    typedef std::vector<IrInterface*> InterfaceVector;
    typedef InterfaceVector::iterator InterfaceVectorIter;

public:
    IrStruct(Type*);
    virtual ~IrStruct();

    Type* type;
    llvm::PATypeHolder recty;
    OffsetMap offsets;
    VarDeclVector defaultFields;

    InterfaceMap interfaceMap;
    InterfaceVector interfaceVec;
    const llvm::ArrayType* interfaceInfosTy;
    LLGlobalVariable* interfaceInfos;

    bool defined;
    bool constinited;

    LLGlobalVariable* vtbl;
#if OPAQUE_VTBLS
    LLConstant* constVtbl;
#else
    LLConstantStruct* constVtbl;
#endif
    LLGlobalVariable* init;
    LLConstant* constInit;
    LLGlobalVariable* classInfo;
    LLConstant* constClassInfo;
    bool hasUnions;
    DUnion* dunion;
    bool classDeclared;
    bool classDefined;

    LLGlobalVariable* dwarfComposite;
};

#endif