File: rttibuilder.h

package info (click to toggle)
ldc 1%3A1.40.0-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 63,308 kB
  • sloc: cpp: 85,368; ansic: 21,877; makefile: 1,705; sh: 1,018; asm: 584; objc: 135; exp: 48; python: 12
file content (77 lines) | stat: -rw-r--r-- 2,550 bytes parent folder | download
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
//===-- 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.
//
//===----------------------------------------------------------------------===//

#pragma once

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

class ClassDeclaration;
class Dsymbol;
class FuncDeclaration;
class Type;
namespace llvm {
class StructType;
class GlobalVariable;
}

class RTTIBuilder {
  /// The offset (in bytes) at which the previously pushed field ended.
  uint64_t prevFieldEnd = 0;

public:
  // 15 is enough for any D2 ClassInfo including 64 bit pointer alignment
  // padding
  llvm::SmallVector<llvm::Constant *, 15> inits;

  explicit RTTIBuilder(Type *baseType);

  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);

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

  /// 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(llvm::GlobalVariable *gvar);

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