Files
ldc/ir/irstruct.h
Tomas Lindquist Olsen 6cf5ca6aba Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... }
Changed the way struct/class fields are added, first small part of cleaning up these...
Make struct/class/union fields aware of any anonymous struct/union they might be part of, not yet really useful, but part of getting better union support.
2008-10-28 15:41:09 +01:00

92 lines
2.1 KiB
C++

#ifndef LDC_IR_IRSTRUCT_H
#define LDC_IR_IRSTRUCT_H
#include "ir/ir.h"
#include <vector>
#include <map>
struct IrInterface : IrBase
{
BaseClass* base;
ClassDeclaration* decl;
llvm::PATypeHolder* vtblTy;
LLConstant* vtblInit;
LLGlobalVariable* vtbl;
const LLStructType* infoTy;
LLConstantStruct* infoInit;
LLConstant* info;
int index;
IrInterface(BaseClass* b);
~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();
void addField(VarDeclaration* v);
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;
bool packed; // true for: align(1) struct S { ... }
LLGlobalVariable* dwarfComposite;
};
#endif