view gen/rttibuilder.h @ 1605:1d5721f9ae18

[WIP] Merge DMD r251: bugzilla 111 (appending a dchar to a char[]) This patch needs some work in the code generation, because of the runtime changes (functions "_d_arrayappendcd" and "_d_arrayappendwd" are added). This doesn't affect existing code though, it just makes with patch a little useless, because something like this: char [] s; s ~= '\u6211'; That failed to compile with a nice error message previously to this change, now fails with and ugly error message (a failed assertion). Apparently there is a regression introduced by this patch too, when compiling Dil I get this assertion message: ldc: /home/luca/tesis/ldc/gen/statements.cpp:132: virtual void ReturnStatement::toIR(IRState*): Assertion `p->topfunc()->getReturnType() == llvm::Type::getVoidTy(gIR->context())' failed. 0 ldc 0x08a91628 Thank god we have bisecting capabilities in VCSs now ;) --- dmd/expression.c | 47 +++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 41 insertions(+), 6 deletions(-)
author Leandro Lucarella <llucax@gmail.com>
date Wed, 06 Jan 2010 15:18:19 -0300
parents 1609490c123f
children
line wrap: on
line source

#ifndef __LDC_GEN_RTTIBUILDER_H__
#define __LDC_GEN_RTTIBUILDER_H__

#include "llvm/Constant.h"
#include "llvm/ADT/SmallVector.h"

struct ClassDeclaration;
struct TypeClass;
struct Type;

struct IrStruct;

struct RTTIBuilder
{
    ClassDeclaration* base;
    TypeClass* basetype;
    IrStruct* baseir;

    // 10 is enough for any D1 TypeInfo
    // 14 is enough for any D1 ClassInfo
    llvm::SmallVector<llvm::Constant*, 14> inits;

    RTTIBuilder(ClassDeclaration* base_class);

    void push(llvm::Constant* C);
    void push_null(Type* T);
    void push_null_vp();
    void push_null_void_array();
    void push_uint(unsigned u);
    void push_size(uint64_t s);
    void push_string(const char* str);
    void push_typeinfo(Type* t);
    void push_classinfo(ClassDeclaration* cd);

    /// pushes the function pointer or a null void* if it cannot.
    void push_funcptr(FuncDeclaration* fd, Type* castto = NULL);

    /// pushes the array slice given.
    void push_array(uint64_t dim, llvm::Constant * ptr);

    /// pushes void[] slice, dim is used directly, ptr is cast to void* .
    void push_void_array(uint64_t dim, llvm::Constant* ptr);

    /// pushes void[] slice with data.
    /// CI is the constant initializer the array should point to, the length
    /// and ptr are resolved automatically
    void push_void_array(llvm::Constant* CI, Type* valtype, Dsymbol* mangle_sym);

    /// pushes valtype[] slice with data.
    /// CI is the constant initializer that .ptr should point to
    /// dim is .length member directly
    /// valtype provides the D element type, .ptr is cast to valtype->pointerTo()
    /// mangle_sym provides the mangle prefix for the symbol generated.
    void push_array(llvm::Constant* CI, uint64_t dim, Type* valtype, Dsymbol* mangle_sym);

    /// Creates the initializer constant and assigns it to the global.
    void finalize(IrGlobal* tid);

    /// Creates the initializer constant and assigns it to the global.
    llvm::Constant* get_constant();
};

#endif