ldc/gen/rttibuilder.h
David Nadlinger cb341586e3 First merge of 2.064 beta.
This corresponds to DMD commit a913ce4bc59a94a022a27e390fc841f4aededffb.

Doesn't build Phobos yet.
2013-10-29 19:21:15 +01:00

87 lines
2.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//===-- gen/rttibuilder.h - TypeInfo generation helper ----------*- C++ -*-===//
//
// LDC the LLVM D compiler
//
// This file is distributed under the BSD-style LDC license. See the LICENSE
// file for details.
//
//===----------------------------------------------------------------------===//
//
// This class is used to build the global TypeInfo/ClassInfo/... constants
// required for the D runtime type information system.
//
//===----------------------------------------------------------------------===//
#ifndef LDC_GEN_RTTIBUILDER_H
#define LDC_GEN_RTTIBUILDER_H
#include "llvm/ADT/SmallVector.h"
#if LDC_LLVM_VER >= 303
#include "llvm/IR/Constant.h"
#else
#include "llvm/Constant.h"
#endif
class AggregateDeclaration;
class ClassDeclaration;
class Dsymbol;
class FuncDeclaration;
struct IrGlobal;
struct IrAggr;
class Type;
class TypeClass;
namespace llvm { class StructType; }
struct RTTIBuilder
{
AggregateDeclaration* base;
TypeClass* basetype;
IrAggr* baseir;
// 10 is enough for any D1 TypeInfo
// 14 is enough for any D1 ClassInfo
llvm::SmallVector<llvm::Constant*, 14> inits;
RTTIBuilder(AggregateDeclaration* 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_size_as_vp(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);
void finalize(llvm::Type* type, llvm::Value* value);
/// Creates the initializer constant and assigns it to the global.
llvm::Constant* get_constant(llvm::StructType* initType);
};
#endif