/
irtypeclass.h
84 lines (64 loc) · 2.46 KB
/
irtypeclass.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//===-- ir/irtypeclass.h - IrType implementation for D classes --*- C++ -*-===//
//
// LDC – the LLVM D compiler
//
// This file is distributed under the BSD-style LDC license. See the LICENSE
// file for details.
//
//===----------------------------------------------------------------------===//
//
// Provides the IrType subclass used to represent D classes.
//
//===----------------------------------------------------------------------===//
#ifndef __LDC_IR_IRTYPECLASS_H__
#define __LDC_IR_IRTYPECLASS_H__
#include "ir/irtypeaggr.h"
#include "llvm/IR/DerivedTypes.h"
template <typename TYPE> struct Array;
using FuncDeclarations = Array<class FuncDeclaration *>;
///
class IrTypeClass : public IrTypeAggr {
public:
///
static IrTypeClass *get(ClassDeclaration *cd);
///
IrTypeClass *isClass() override { return this; }
///
llvm::Type *getLLType() override;
/// Returns the actual storage type, i.e. without the indirection
/// for the class reference.
llvm::Type *getMemoryLLType();
/// Returns the vtable type for this class.
llvm::ArrayType *getVtblType() { return vtbl_type; }
/// Get index to interface implementation.
/// Returns the index of a specific interface implementation in this
/// class or ~0 if not found.
size_t getInterfaceIndex(ClassDeclaration *inter);
/// Returns the number of interface implementations (vtables) in this
/// class.
unsigned getNumInterfaceVtbls() { return num_interface_vtbls; }
protected:
///
explicit IrTypeClass(ClassDeclaration *cd);
///
ClassDeclaration *cd = nullptr;
///
TypeClass *tc = nullptr;
/// Vtable type.
llvm::ArrayType *vtbl_type = nullptr;
/// Number of interface implementations (vtables) in this class.
unsigned num_interface_vtbls = 0;
/// std::map type mapping ClassDeclaration* to size_t.
using ClassIndexMap = std::map<ClassDeclaration *, size_t>;
/// Map for mapping the index of a specific interface implementation
/// in this class to its ClassDeclaration.
ClassIndexMap interfaceMap;
//////////////////////////////////////////////////////////////////////////
/// Adds the data members for the given class to the type builder, including
/// those inherited from base classes/interfaces.
void addClassData(AggrTypeBuilder &builder, ClassDeclaration *currCd);
/// Adds the interface and all it's base interface to the interface
/// to index map.
void addInterfaceToMap(ClassDeclaration *inter, size_t index);
};
#endif