blob: 37fa1230f69e4a5d4f1a7f7ec0d21649d0cd54ff [file] [log] [blame]
Anders Carlssondbd920c2009-10-11 22:13:54 +00001//===--- CGVtable.h - Emit LLVM Code for C++ vtables ----------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This contains code dealing with C++ code generation of virtual tables.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef CLANG_CODEGEN_CGVTABLE_H
15#define CLANG_CODEGEN_CGVTABLE_H
16
17#include "llvm/ADT/DenseMap.h"
Anders Carlsson35272252009-12-06 00:23:49 +000018#include "llvm/GlobalVariable.h"
Anders Carlssona0fdd912009-11-13 17:08:56 +000019#include "GlobalDecl.h"
Anders Carlssondbd920c2009-10-11 22:13:54 +000020
21namespace clang {
Anders Carlssondbd920c2009-10-11 22:13:54 +000022 class CXXRecordDecl;
Benjamin Kramer39411b92009-11-26 13:09:03 +000023
Anders Carlssondbd920c2009-10-11 22:13:54 +000024namespace CodeGen {
25 class CodeGenModule;
Anders Carlssona94822e2009-11-26 02:32:05 +000026
Benjamin Kramer39411b92009-11-26 13:09:03 +000027/// ThunkAdjustment - Virtual and non-virtual adjustment for thunks.
28class ThunkAdjustment {
29public:
Anders Carlssona94822e2009-11-26 02:32:05 +000030 ThunkAdjustment(int64_t NonVirtual, int64_t Virtual)
Benjamin Kramer39411b92009-11-26 13:09:03 +000031 : NonVirtual(NonVirtual),
Anders Carlssona94822e2009-11-26 02:32:05 +000032 Virtual(Virtual) { }
Benjamin Kramer39411b92009-11-26 13:09:03 +000033
Anders Carlssona94822e2009-11-26 02:32:05 +000034 ThunkAdjustment()
35 : NonVirtual(0), Virtual(0) { }
Benjamin Kramer39411b92009-11-26 13:09:03 +000036
Anders Carlssona94822e2009-11-26 02:32:05 +000037 // isEmpty - Return whether this thunk adjustment is empty.
Benjamin Kramer39411b92009-11-26 13:09:03 +000038 bool isEmpty() const {
Anders Carlssona94822e2009-11-26 02:32:05 +000039 return NonVirtual == 0 && Virtual == 0;
40 }
Benjamin Kramer39411b92009-11-26 13:09:03 +000041
Anders Carlssona94822e2009-11-26 02:32:05 +000042 /// NonVirtual - The non-virtual adjustment.
43 int64_t NonVirtual;
Benjamin Kramer39411b92009-11-26 13:09:03 +000044
Anders Carlssona94822e2009-11-26 02:32:05 +000045 /// Virtual - The virtual adjustment.
46 int64_t Virtual;
47};
48
Anders Carlsson7622cd32009-11-26 03:09:37 +000049/// CovariantThunkAdjustment - Adjustment of the 'this' pointer and the
50/// return pointer for covariant thunks.
Benjamin Kramer39411b92009-11-26 13:09:03 +000051class CovariantThunkAdjustment {
52public:
Anders Carlsson7622cd32009-11-26 03:09:37 +000053 CovariantThunkAdjustment(const ThunkAdjustment &ThisAdjustment,
54 const ThunkAdjustment &ReturnAdjustment)
55 : ThisAdjustment(ThisAdjustment), ReturnAdjustment(ReturnAdjustment) { }
56
57 CovariantThunkAdjustment() { }
58
59 ThunkAdjustment ThisAdjustment;
60 ThunkAdjustment ReturnAdjustment;
61};
62
Anders Carlssondbd920c2009-10-11 22:13:54 +000063class CGVtableInfo {
64 CodeGenModule &CGM;
Benjamin Kramer39411b92009-11-26 13:09:03 +000065
Anders Carlssondbd920c2009-10-11 22:13:54 +000066 /// MethodVtableIndices - Contains the index (relative to the vtable address
67 /// point) where the function pointer for a virtual function is stored.
Anders Carlssona0fdd912009-11-13 17:08:56 +000068 typedef llvm::DenseMap<GlobalDecl, int64_t> MethodVtableIndicesTy;
Anders Carlssondbd920c2009-10-11 22:13:54 +000069 MethodVtableIndicesTy MethodVtableIndices;
Benjamin Kramer39411b92009-11-26 13:09:03 +000070
Anders Carlssondbd920c2009-10-11 22:13:54 +000071 typedef std::pair<const CXXRecordDecl *,
72 const CXXRecordDecl *> ClassPairTy;
Benjamin Kramer39411b92009-11-26 13:09:03 +000073
Anders Carlssondbd920c2009-10-11 22:13:54 +000074 /// VirtualBaseClassIndicies - Contains the index into the vtable where the
75 /// offsets for virtual bases of a class are stored.
76 typedef llvm::DenseMap<ClassPairTy, int64_t> VirtualBaseClassIndiciesTy;
77 VirtualBaseClassIndiciesTy VirtualBaseClassIndicies;
Mike Stump380dd752009-11-10 07:44:33 +000078
Anders Carlsson8c2d36f2009-12-06 00:01:05 +000079 /// Vtables - All the vtables which have been defined.
80 llvm::DenseMap<const CXXRecordDecl *, llvm::GlobalVariable *> Vtables;
Anders Carlssond6b07fb2009-11-27 20:47:55 +000081
82 /// NumVirtualFunctionPointers - Contains the number of virtual function
83 /// pointers in the vtable for a given record decl.
84 llvm::DenseMap<const CXXRecordDecl *, uint64_t> NumVirtualFunctionPointers;
85
86 /// getNumVirtualFunctionPointers - Return the number of virtual function
87 /// pointers in the vtable for a given record decl.
88 uint64_t getNumVirtualFunctionPointers(const CXXRecordDecl *RD);
89
90 void ComputeMethodVtableIndices(const CXXRecordDecl *RD);
91
Anders Carlsson1a5e0d72009-11-30 23:41:22 +000092 /// GenerateClassData - Generate all the class data requires to be generated
93 /// upon definition of a KeyFunction. This includes the vtable, the
94 /// rtti data structure and the VTT.
95 void GenerateClassData(const CXXRecordDecl *RD);
Anders Carlsson8c2d36f2009-12-06 00:01:05 +000096
Anders Carlsson35272252009-12-06 00:23:49 +000097 llvm::GlobalVariable *
98
99 GenerateVtable(llvm::GlobalVariable::LinkageTypes Linkage,
100 const CXXRecordDecl *LayoutClass, const CXXRecordDecl *RD,
101 uint64_t Offset);
Anders Carlsson8c2d36f2009-12-06 00:01:05 +0000102
Anders Carlssondbd920c2009-10-11 22:13:54 +0000103public:
Benjamin Kramer39411b92009-11-26 13:09:03 +0000104 CGVtableInfo(CodeGenModule &CGM)
Anders Carlssondbd920c2009-10-11 22:13:54 +0000105 : CGM(CGM) { }
106
107 /// getMethodVtableIndex - Return the index (relative to the vtable address
Benjamin Kramer39411b92009-11-26 13:09:03 +0000108 /// point) where the function pointer for the given virtual function is
Anders Carlssondbd920c2009-10-11 22:13:54 +0000109 /// stored.
Anders Carlssond6b07fb2009-11-27 20:47:55 +0000110 uint64_t getMethodVtableIndex(GlobalDecl GD);
Benjamin Kramer39411b92009-11-26 13:09:03 +0000111
Mike Stumpab28c132009-10-13 22:54:56 +0000112 /// getVirtualBaseOffsetIndex - Return the index (relative to the vtable
113 /// address point) where the offset of the virtual base that contains the
114 /// given Base is stored, otherwise, if no virtual base contains the given
115 /// class, return 0. Base must be a virtual base class or an unambigious
116 /// base.
Benjamin Kramer39411b92009-11-26 13:09:03 +0000117 int64_t getVirtualBaseOffsetIndex(const CXXRecordDecl *RD,
Anders Carlssondbd920c2009-10-11 22:13:54 +0000118 const CXXRecordDecl *VBase);
Mike Stump380dd752009-11-10 07:44:33 +0000119
Anders Carlsson9ac95b92009-12-05 21:03:56 +0000120 /// getVtableAddressPoint - returns the address point of the vtable for the
121 /// given record decl.
122 /// FIXME: This should return a list of address points.
123 uint64_t getVtableAddressPoint(const CXXRecordDecl *RD);
124
Anders Carlsson8c2d36f2009-12-06 00:01:05 +0000125 llvm::GlobalVariable *getVtable(const CXXRecordDecl *RD);
126 llvm::GlobalVariable *getCtorVtable(const CXXRecordDecl *RD,
127 const CXXRecordDecl *Class,
128 uint64_t Offset);
Anders Carlsson1a5e0d72009-11-30 23:41:22 +0000129
130
131 void MaybeEmitVtable(GlobalDecl GD);
Anders Carlssondbd920c2009-10-11 22:13:54 +0000132};
Benjamin Kramer39411b92009-11-26 13:09:03 +0000133
Anders Carlssondbd920c2009-10-11 22:13:54 +0000134}
135}
136#endif