Skip to content

Commit 3b01adb

Browse files
Merge pull request #101 from AjayBrahmakshatriya/master
Support for general types inside static_var
2 parents 36a6c96 + 0c54bbc commit 3b01adb

File tree

22 files changed

+558
-206
lines changed

22 files changed

+558
-206
lines changed

include/blocks/label_inserter.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class label_creator : public block_visitor {
1616
public:
1717
using block_visitor::visit;
1818
std::vector<tracer::tag> collected_labels;
19-
std::unordered_map<std::string, label::Ptr> offset_to_label;
19+
std::unordered_map<tracer::tag, label::Ptr> offset_to_label;
2020
int current_label = 0;
2121
virtual void visit(stmt_block::Ptr);
2222
};
@@ -27,10 +27,10 @@ class label_inserter : public block_visitor {
2727
// The main table to hold static tag to label mapping
2828
// this table holds the jump target that is in the parent of the
2929
// jump statement
30-
std::unordered_map<std::string, label::Ptr> offset_to_label;
30+
std::unordered_map<tracer::tag, label::Ptr> offset_to_label;
3131
// A backup table which has atleast one label that we can jump to
3232
// Only used when feature_unstructured is used
33-
std::unordered_map<std::string, label::Ptr> backup_offset_to_label;
33+
std::unordered_map<tracer::tag, label::Ptr> backup_offset_to_label;
3434

3535
bool feature_unstructured;
3636

include/blocks/var_namer.h

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,20 @@ namespace block {
1111
class var_gather_escapes : public block_visitor {
1212
public:
1313
using block_visitor::visit;
14-
std::vector<std::string> &escaping_tags;
15-
var_gather_escapes(std::vector<std::string> &e) : escaping_tags(e) {}
14+
std::vector<tracer::tag> &escaping_tags;
15+
var_gather_escapes(std::vector<tracer::tag> &e) : escaping_tags(e) {}
1616
virtual void visit(decl_stmt::Ptr) override;
1717
};
1818

1919
class var_namer : public block_visitor {
2020
public:
2121
using block_visitor::visit;
2222
int var_counter = 0;
23-
std::map<std::string, var::Ptr> collected_decls;
24-
std::map<std::string, decl_stmt::Ptr> decls_to_hoist;
25-
std::vector<std::string> decl_tags_to_hoist;
23+
std::unordered_map<tracer::tag, var::Ptr> collected_decls;
24+
std::unordered_map<tracer::tag, decl_stmt::Ptr> decls_to_hoist;
25+
std::vector<tracer::tag> decl_tags_to_hoist;
2626

27-
std::vector<std::string> escaping_tags;
27+
std::vector<tracer::tag> escaping_tags;
2828

2929
virtual void visit(decl_stmt::Ptr) override;
3030

@@ -34,9 +34,9 @@ class var_namer : public block_visitor {
3434
class var_replacer : public block_visitor {
3535
public:
3636
using block_visitor::visit;
37-
std::map<std::string, var::Ptr> &collected_decls;
38-
std::vector<std::string> &escaping_tags;
39-
var_replacer(std::map<std::string, var::Ptr> &d, std::vector<std::string> &e)
37+
std::unordered_map<tracer::tag, var::Ptr> &collected_decls;
38+
std::vector<tracer::tag> &escaping_tags;
39+
var_replacer(std::unordered_map<tracer::tag, var::Ptr> &d, std::vector<tracer::tag> &e)
4040
: collected_decls(d), escaping_tags(e) {}
4141

4242
virtual void visit(var_expr::Ptr) override;
@@ -45,9 +45,9 @@ class var_replacer : public block_visitor {
4545
class var_hoister : public block_replacer {
4646
public:
4747
using block_replacer::visit;
48-
std::map<std::string, decl_stmt::Ptr> &decls_to_hoist;
49-
std::vector<std::string> &escaping_tags;
50-
var_hoister(std::map<std::string, decl_stmt::Ptr> &d, std::vector<std::string> &e)
48+
std::unordered_map<tracer::tag, decl_stmt::Ptr> &decls_to_hoist;
49+
std::vector<tracer::tag> &escaping_tags;
50+
var_hoister(std::unordered_map<tracer::tag, decl_stmt::Ptr> &d, std::vector<tracer::tag> &e)
5151
: decls_to_hoist(d), escaping_tags(e) {}
5252
virtual void visit(decl_stmt::Ptr) override;
5353
};

include/builder/block_type_extractor.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44

55
#include "builder/forward_declarations.h"
6+
#include "util/mtp_utils.h"
67
#include "builder/generics.h"
78
#include <algorithm>
89

@@ -13,8 +14,6 @@ struct custom_type_base;
1314
template <typename T>
1415
struct external_type_namer;
1516

16-
17-
1817
extern int type_naming_counter;
1918

2019
template <typename T, typename V=void>
@@ -41,7 +40,7 @@ member or a external_namer specialization */
4140
template <typename T, typename V=void>
4241
struct has_type_name: public std::false_type {};
4342
template <typename T>
44-
struct has_type_name<T, typename check_valid_type<decltype(T::type_name)>::type>: public std::true_type {};
43+
struct has_type_name<T, typename utils::check_valid_type<decltype(T::type_name)>::type>: public std::true_type {};
4544

4645
template <typename T>
4746
struct type_namer<T, typename std::enable_if<has_type_name<external_type_namer<T>>::value>::type> {
@@ -66,14 +65,14 @@ struct type_template {
6665
};
6766

6867
template <typename T>
69-
struct type_template<T, typename check_valid_type<decltype(T::get_template_arg_types)>::type> {
68+
struct type_template<T, typename utils::check_valid_type<decltype(T::get_template_arg_types)>::type> {
7069
static std::vector<block::type::Ptr> get_templates() {
7170
return T::get_template_arg_types();
7271
}
7372
};
7473

7574
template <typename T>
76-
struct type_template<T, typename check_valid_type<decltype(external_type_namer<T>::get_template_arg_types)>::type> {
75+
struct type_template<T, typename utils::check_valid_type<decltype(external_type_namer<T>::get_template_arg_types)>::type> {
7776
static std::vector<block::type::Ptr> get_templates() {
7877
return external_type_namer<T>::get_template_arg_types();
7978
}

include/builder/builder_context.h

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,31 +18,10 @@ block::expr::Ptr create_foreign_expr(const T t);
1818
template <typename T>
1919
builder create_foreign_expr_builder(const T t);
2020

21-
class static_var_base;
22-
23-
class tracking_tuple {
24-
public:
25-
const unsigned char *ptr;
26-
uint32_t size;
27-
static_var_base *var_ref;
28-
29-
tracking_tuple(const unsigned char *_ptr, uint32_t _size, static_var_base *_var_ref)
30-
: ptr(_ptr), size(_size), var_ref(_var_ref) {}
31-
32-
std::string snapshot(void) {
33-
std::string output_string;
34-
char temp[4];
35-
for (unsigned int i = 0; i < size; i++) {
36-
sprintf(temp, "%02x", ptr[i]);
37-
output_string += temp;
38-
}
39-
return output_string;
40-
}
41-
};
4221

4322
class tag_map {
4423
public:
45-
std::unordered_map<std::string, block::stmt_block::Ptr> map;
24+
std::unordered_map<tracer::tag, block::stmt_block::Ptr> map;
4625
};
4726

4827
void lambda_wrapper(std::function<void(void)>);
@@ -67,21 +46,21 @@ class builder_context {
6746
block::stmt::Ptr ast;
6847
block::stmt_block::Ptr current_block_stmt;
6948
std::vector<bool> bool_vector;
70-
std::unordered_set<std::string> visited_offsets;
49+
std::unordered_set<tracer::tag> visited_offsets;
7150
std::vector<block::expr::Ptr> expr_sequence;
7251
unsigned long long expr_counter = 0;
7352
std::string current_label;
7453

75-
std::vector<tracking_tuple> static_var_tuples;
76-
std::vector<tracking_tuple> deferred_static_var_tuples;
54+
std::vector<static_var_base*> static_var_tuples;
55+
std::vector<static_var_base*> deferred_static_var_tuples;
7756

7857
// Run shared state
7958
tag_map _internal_tags;
8059
tag_map *memoized_tags;
8160

8261
// State shared across non-deterministic failures
83-
std::unordered_map<std::string, std::shared_ptr<nd_var_gen_base>> *nd_state_map = nullptr;
84-
std::unordered_map<std::string, std::shared_ptr<nd_var_gen_base>> _nd_state_map;
62+
std::unordered_map<tracer::tag, std::shared_ptr<nd_var_gen_base>> *nd_state_map = nullptr;
63+
std::unordered_map<tracer::tag, std::shared_ptr<nd_var_gen_base>> _nd_state_map;
8564

8665
void reset_for_nd_failure();
8766

include/builder/dyn_var.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include "builder/builder.h"
55
#include "util/var_finder.h"
6+
#include "util/mtp_utils.h"
67
namespace builder {
78

89
namespace options {
@@ -125,7 +126,7 @@ class dyn_var_impl : public var {
125126
dyn_var->var_type = create_block_type();
126127
block_var = dyn_var;
127128
// Don't try to obtain preferred names for objects created without context
128-
// dyn_var->preferred_name = util::find_variable_name(this);
129+
// dyn_var->preferred_name = utils::find_variable_name(this);
129130
return;
130131
}
131132
assert(builder_context::current_builder_context != nullptr);
@@ -134,7 +135,7 @@ class dyn_var_impl : public var {
134135
block::var::Ptr dyn_var = std::make_shared<block::var>();
135136
dyn_var->var_type = create_block_type();
136137
tracer::tag offset = get_offset_in_function();
137-
dyn_var->preferred_name = util::find_variable_name_cached(this, offset.stringify());
138+
dyn_var->preferred_name = utils::find_variable_name_cached(this, offset);
138139
block_var = dyn_var;
139140
dyn_var->static_offset = offset;
140141
block_decl_stmt = nullptr;
@@ -363,7 +364,7 @@ struct dyn_var_deref_provider {
363364
};
364365

365366
template <typename T>
366-
struct dyn_var_deref_provider<T, typename check_valid_type<typename T::dereference_type>::type> {
367+
struct dyn_var_deref_provider<T, typename utils::check_valid_type<typename T::dereference_type>::type> {
367368
dyn_var_mimic<typename T::dereference_type> operator[] (const builder& b) {
368369
return (cast)(static_cast<dyn_var<T>*>(this)->dyn_var_impl<T>::operator[](b));
369370
}

include/builder/forward_declarations.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ using is_builder_type = typename std::is_same<builder, T>;
1616
template <typename T>
1717
using if_builder = typename std::enable_if<is_builder_type<T>::value, T>::type;
1818

19+
class static_var_base;
20+
1921
template <typename T>
2022
class static_var;
2123

@@ -60,11 +62,6 @@ struct with_name {
6062
with_name(const std::string &n, bool wd = false) : name(n), with_decl(wd) {}
6163
};
6264

63-
template <typename T>
64-
struct check_valid_type {
65-
typedef void type;
66-
};
67-
6865
// Generator states for non-deterministic values
6966
struct nd_var_gen_base;
7067

include/builder/nd_var.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,13 @@ struct nd_var_gen<bool>: public nd_var_gen_base {
2828

2929
template <typename T>
3030
std::shared_ptr<nd_var_gen<T>> get_or_create_generator(tracer::tag req_tag) {
31-
std::string tag_name = req_tag.stringify();
32-
33-
if (builder_context::current_builder_context->nd_state_map->find(tag_name) ==
31+
if (builder_context::current_builder_context->nd_state_map->find(req_tag) ==
3432
builder_context::current_builder_context->nd_state_map->end()) {
35-
(*(builder_context::current_builder_context->nd_state_map))[tag_name] = std::make_shared<nd_var_gen<T>>();
33+
(*(builder_context::current_builder_context->nd_state_map))[req_tag] = std::make_shared<nd_var_gen<T>>();
3634
}
3735

3836
return std::static_pointer_cast<nd_var_gen<T>>(
39-
(*(builder_context::current_builder_context->nd_state_map))[tag_name]);
37+
(*(builder_context::current_builder_context->nd_state_map))[req_tag]);
4038
}
4139

4240
/* contstraints on bool types

0 commit comments

Comments
 (0)