CBMC
fresh_symbol.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Fresh auxiliary symbol creation
4 
5 Author: Chris Smowton, chris.smowton@diffblue.com
6 
7 \*******************************************************************/
8 
11 
12 #include "fresh_symbol.h"
13 
14 #include "invariant.h"
15 #include "namespace.h"
16 #include "rename.h"
17 #include "symbol.h"
18 #include "symbol_table_base.h"
19 
33  const typet &type,
34  const std::string &name_prefix,
35  const std::string &basename_prefix,
36  const source_locationt &source_location,
37  const irep_idt &symbol_mode,
38  const namespacet &ns,
39  symbol_table_baset &symbol_table)
40 {
41  irep_idt identifier = basename_prefix;
42  std::size_t prefix_size = 0;
43  if(!name_prefix.empty())
44  {
45  identifier = name_prefix + "::" + basename_prefix;
46  prefix_size = name_prefix.size() + 2;
47  }
48  identifier = get_new_name(identifier, ns, '$');
49  std::string basename = id2string(identifier).substr(prefix_size);
50 
51  auxiliary_symbolt new_symbol(basename, type);
52  new_symbol.name = identifier;
53  new_symbol.location = source_location;
54  new_symbol.mode = symbol_mode;
55  std::pair<symbolt &, bool> res = symbol_table.insert(std::move(new_symbol));
56  CHECK_RETURN(res.second);
57 
58  return res.first;
59 }
60 
73  const typet &type,
74  const std::string &name_prefix,
75  const std::string &basename_prefix,
76  const source_locationt &source_location,
77  const irep_idt &symbol_mode,
78  symbol_table_baset &symbol_table)
79 {
80  return get_fresh_aux_symbol(
81  type,
82  name_prefix,
83  basename_prefix,
84  source_location,
85  symbol_mode,
86  namespacet(symbol_table),
87  symbol_table);
88 }
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:36
get_new_name
irep_idt get_new_name(const irep_idt &name, const namespacet &ns, char delimiter)
Build and identifier not yet present in the namespace ns based on name.
Definition: rename.cpp:16
CHECK_RETURN
#define CHECK_RETURN(CONDITION)
Definition: invariant.h:495
typet
The type of an expression, extends irept.
Definition: type.h:28
fresh_symbol.h
invariant.h
auxiliary_symbolt
Internally generated symbol table entry.
Definition: symbol.h:146
namespace.h
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:90
symbolt::mode
irep_idt mode
Language mode.
Definition: symbol.h:49
rename.h
id2string
const std::string & id2string(const irep_idt &d)
Definition: irep.h:47
symbol_table_baset
The symbol table base class interface.
Definition: symbol_table_base.h:21
symbol.h
Symbol table entry.
source_locationt
Definition: source_location.h:18
symbolt::location
source_locationt location
Source code location of definition of symbol.
Definition: symbol.h:37
symbolt
Symbol table entry.
Definition: symbol.h:27
symbol_table_baset::insert
virtual std::pair< symbolt &, bool > insert(symbolt symbol)=0
Move or copy a new symbol to the symbol table.
symbol_table_base.h
Author: Diffblue Ltd.
get_fresh_aux_symbol
symbolt & get_fresh_aux_symbol(const typet &type, const std::string &name_prefix, const std::string &basename_prefix, const source_locationt &source_location, const irep_idt &symbol_mode, const namespacet &ns, symbol_table_baset &symbol_table)
Installs a fresh-named symbol with respect to the given namespace ns with the requested name pattern ...
Definition: fresh_symbol.cpp:32
symbolt::name
irep_idt name
The unique identifier.
Definition: symbol.h:40
dstringt::size
size_t size() const
Definition: dstring.h:120