CBMC
cpp_typecheck_virtual_table.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: C++ Language Type Checking
4 
5 Author: Daniel Kroening, kroening@cs.cmu.edu
6 
7 \*******************************************************************/
8 
11 
12 #include "cpp_typecheck.h"
13 
14 #include <util/c_types.h>
15 #include <util/pointer_expr.h>
16 #include <util/std_expr.h>
17 
19 {
20  assert(symbol.type.id()==ID_struct);
21 
22  // builds virtual-table value maps: (class x virtual_name x value)
23  std::map<irep_idt, std::map<irep_idt, exprt> > vt_value_maps;
24 
25  const struct_typet &struct_type=to_struct_type(symbol.type);
26 
27  for(std::size_t i=0; i < struct_type.components().size(); i++)
28  {
29  const struct_typet::componentt &compo=struct_type.components()[i];
30  if(!compo.get_bool(ID_is_virtual))
31  continue;
32 
33  const code_typet &code_type=to_code_type(compo.type());
34  assert(code_type.parameters().size() > 0);
35 
36  const pointer_typet &parameter_pointer_type=
37  to_pointer_type(code_type.parameters()[0].type());
38 
39  const irep_idt &class_id =
40  parameter_pointer_type.base_type().get(ID_identifier);
41 
42  std::map<irep_idt, exprt> &value_map =
43  vt_value_maps[class_id];
44 
45  exprt e=symbol_exprt(compo.get_name(), code_type);
46 
47  if(compo.get_bool(ID_is_pure_virtual))
48  {
49  pointer_typet code_pointer_type=pointer_type(code_type);
50  e=null_pointer_exprt(code_pointer_type);
51  value_map[compo.get(ID_virtual_name)] = e;
52  }
53  else
54  {
55  address_of_exprt address(e);
56  value_map[compo.get(ID_virtual_name)] = address;
57  }
58  }
59 
60  // create virtual-table symbol variables
61  for(std::map<irep_idt, std::map<irep_idt, exprt> >::const_iterator cit =
62  vt_value_maps.begin(); cit!=vt_value_maps.end(); cit++)
63  {
64  const std::map<irep_idt, exprt> &value_map=cit->second;
65 
66  const symbolt &late_cast_symb = lookup(cit->first);
67  const symbolt &vt_symb_type =
68  lookup("virtual_table::" + id2string(late_cast_symb.name));
69 
70  symbolt vt_symb_var;
71  vt_symb_var.name=
72  id2string(vt_symb_type.name) + "@"+ id2string(symbol.name);
73  vt_symb_var.base_name=
74  id2string(vt_symb_type.base_name) + "@" + id2string(symbol.base_name);
75  vt_symb_var.mode = symbol.mode;
76  vt_symb_var.module=module;
77  vt_symb_var.location=vt_symb_type.location;
78  vt_symb_var.type = struct_tag_typet(vt_symb_type.name);
79  vt_symb_var.is_lvalue=true;
80  vt_symb_var.is_static_lifetime=true;
81 
82  // do the values
83  const struct_typet &vt_type=to_struct_type(vt_symb_type.type);
84 
85  struct_exprt values({}, struct_tag_typet(vt_symb_type.name));
86 
87  for(const auto &compo : vt_type.components())
88  {
89  std::map<irep_idt, exprt>::const_iterator cit2 =
90  value_map.find(compo.get_base_name());
91  assert(cit2!=value_map.end());
92  const exprt &value=cit2->second;
93  assert(value.type()==compo.type());
94  values.operands().push_back(value);
95  }
96  vt_symb_var.value=values;
97 
98  bool failed=!symbol_table.insert(std::move(vt_symb_var)).second;
100  }
101 }
cpp_typecheckt::do_virtual_table
void do_virtual_table(const symbolt &symbol)
Definition: cpp_typecheck_virtual_table.cpp:18
struct_union_typet::components
const componentst & components() const
Definition: std_types.h:147
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:36
to_struct_type
const struct_typet & to_struct_type(const typet &type)
Cast a typet to a struct_typet.
Definition: std_types.h:308
CHECK_RETURN
#define CHECK_RETURN(CONDITION)
Definition: invariant.h:495
symbolt::type
typet type
Type of symbol.
Definition: symbol.h:31
exprt
Base class for all expressions.
Definition: expr.h:55
symbolt::base_name
irep_idt base_name
Base (non-scoped) name.
Definition: symbol.h:46
struct_tag_typet
A struct tag type, i.e., struct_typet with an identifier.
Definition: std_types.h:448
symbol_exprt
Expression to hold a symbol (variable)
Definition: std_expr.h:112
irept::get
const irep_idt & get(const irep_idt &name) const
Definition: irep.cpp:45
struct_exprt
Struct constructor from list of elements.
Definition: std_expr.h:1818
exprt::type
typet & type()
Return the type of the expression.
Definition: expr.h:84
namespacet::lookup
bool lookup(const irep_idt &name, const symbolt *&symbol) const override
See documentation for namespace_baset::lookup().
Definition: namespace.cpp:138
c_typecheck_baset::module
const irep_idt module
Definition: c_typecheck_base.h:69
to_code_type
const code_typet & to_code_type(const typet &type)
Cast a typet to a code_typet.
Definition: std_types.h:744
symbolt::mode
irep_idt mode
Language mode.
Definition: symbol.h:49
null_pointer_exprt
The null pointer constant.
Definition: pointer_expr.h:734
id2string
const std::string & id2string(const irep_idt &d)
Definition: irep.h:47
struct_union_typet::componentt::get_name
const irep_idt & get_name() const
Definition: std_types.h:79
failed
static bool failed(bool error_indicator)
Definition: symtab2gb_parse_options.cpp:39
pointer_expr.h
to_pointer_type
const pointer_typet & to_pointer_type(const typet &type)
Cast a typet to a pointer_typet.
Definition: pointer_expr.h:79
symbol_tablet::insert
virtual std::pair< symbolt &, bool > insert(symbolt symbol) override
Author: Diffblue Ltd.
Definition: symbol_table.cpp:17
c_typecheck_baset::symbol_table
symbol_tablet & symbol_table
Definition: c_typecheck_base.h:68
pointer_type
pointer_typet pointer_type(const typet &subtype)
Definition: c_types.cpp:253
code_typet
Base type of functions.
Definition: std_types.h:538
irept::id
const irep_idt & id() const
Definition: irep.h:396
code_typet::parameters
const parameterst & parameters() const
Definition: std_types.h:655
cpp_typecheck.h
struct_union_typet::componentt
Definition: std_types.h:68
symbolt::value
exprt value
Initial value of symbol.
Definition: symbol.h:34
struct_typet
Structure type, corresponds to C style structs.
Definition: std_types.h:230
symbolt::location
source_locationt location
Source code location of definition of symbol.
Definition: symbol.h:37
symbolt
Symbol table entry.
Definition: symbol.h:27
pointer_typet::base_type
const typet & base_type() const
The type of the data what we point to.
Definition: pointer_expr.h:35
symbolt::is_static_lifetime
bool is_static_lifetime
Definition: symbol.h:65
symbolt::is_lvalue
bool is_lvalue
Definition: symbol.h:66
address_of_exprt
Operator to return the address of an object.
Definition: pointer_expr.h:370
pointer_typet
The pointer type These are both 'bitvector_typet' (they have a width) and 'type_with_subtypet' (they ...
Definition: pointer_expr.h:23
symbolt::module
irep_idt module
Name of module the symbol belongs to.
Definition: symbol.h:43
std_expr.h
c_types.h
symbolt::name
irep_idt name
The unique identifier.
Definition: symbol.h:40
irept::get_bool
bool get_bool(const irep_idt &name) const
Definition: irep.cpp:58