Mercurial > projects > ldc
diff gen/structs.h @ 88:058d3925950e trunk
[svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
author | lindquist |
---|---|
date | Tue, 06 Nov 2007 10:03:14 +0100 |
parents | |
children | 5071469303d4 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gen/structs.h Tue Nov 06 10:03:14 2007 +0100 @@ -0,0 +1,49 @@ +#ifndef LLVMD_GEN_STRUCTS_H +#define LLVMD_GEN_STRUCTS_H + +struct StructInitializer; +const llvm::Type* DtoStructType(Type* t); +llvm::Value* DtoStructZeroInit(llvm::Value* v); +llvm::Value* DtoStructCopy(llvm::Value* dst, llvm::Value* src); +llvm::Constant* DtoConstStructInitializer(StructInitializer* si); +llvm::Value* DtoIndexStruct(llvm::Value* ptr, StructDeclaration* sd, Type* t, unsigned os, std::vector<unsigned>& idxs); + +struct DUnionField +{ + unsigned offset; + size_t size; + std::vector<const llvm::Type*> types; + llvm::Constant* init; + size_t initsize; + + DUnionField() { + offset = 0; + size = 0; + init = NULL; + initsize = 0; + } +}; + +struct DUnionIdx +{ + unsigned idx,idxos; + llvm::Constant* c; + + DUnionIdx() + : idx(0), c(0) {} + DUnionIdx(unsigned _idx, unsigned _idxos, llvm::Constant* _c) + : idx(_idx), idxos(_idxos), c(_c) {} + bool operator<(const DUnionIdx& i) const { + return (idx < i.idx) || (idx == i.idx && idxos < i.idxos); + } +}; + +class DUnion +{ + std::vector<DUnionField> fields; +public: + DUnion(); + llvm::Constant* getConst(std::vector<DUnionIdx>& in); +}; + +#endif