Skip to content

Commit b29dae5

Browse files
Dwight Guthrv-jenkins
andauthored
Add MapIter and SetIter sort categories (#1080)
This is the first of a sequence of PRs designed to make progress towards generating stack maps so that we can trigger the GC during allocation rather than in between rewrite steps only. The first few PRs will be preliminaries that add small features that will be used by future PRs. This PR adds a SetIter and MapIter sort category. These sort categories are needed because the stack may contain references to live sets and maps through these iterators that need to be relocated by the GC. However, no K terms will ever be created with these sort categories, so a lot of the code cases currently in the code deliberately do not handle these categories. Future PRs will add GC code to handle fixing up the pointer to a collection contained in these iterators. --------- Co-authored-by: rv-jenkins <[email protected]>
1 parent 9eee51f commit b29dae5

File tree

10 files changed

+47
-7
lines changed

10 files changed

+47
-7
lines changed

bindings/python/ast.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,9 +231,11 @@ void bind_ast(py::module_ &m) {
231231
py::enum_<sort_category>(ast, "SortCategory")
232232
.value("Uncomputed", sort_category::Uncomputed)
233233
.value("Map", sort_category::Map)
234+
.value("MapIter", sort_category::MapIter)
234235
.value("RangeMap", sort_category::RangeMap)
235236
.value("List", sort_category::List)
236237
.value("Set", sort_category::Set)
238+
.value("SetIter", sort_category::SetIter)
237239
.value("Int", sort_category::Int)
238240
.value("Float", sort_category::Float)
239241
.value("StringBuffer", sort_category::StringBuffer)

cmake/RuntimeConfig.cmake

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ set(STRINGBUFFER_LAYOUT 6)
3434
set(BOOL_LAYOUT 7)
3535
set(SYMBOL_LAYOUT 8)
3636
set(VARIABLE_LAYOUT 9)
37-
set(RANGEMAP_LAYOUT 11)
37+
set(RANGEMAP_LAYOUT 10)
38+
set(SETITER_LAYOUT 11)
39+
set(MAPITER_LAYOUT 12)
3840

3941
get_filename_component(INSTALL_DIR_ABS_PATH "${CMAKE_INSTALL_PREFIX}"
4042
REALPATH BASE_DIR "${CMAKE_BINARY_DIR}")

config/macros.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
#define SYMBOL_LAYOUT @SYMBOL_LAYOUT@
2626
#define VARIABLE_LAYOUT @VARIABLE_LAYOUT@
2727
#define RANGEMAP_LAYOUT @RANGEMAP_LAYOUT@
28+
#define SETITER_LAYOUT @SETITER_LAYOUT@
29+
#define MAPITER_LAYOUT @MAPITER_LAYOUT@
2830

2931
#define STRINGIFY(x) #x
3032
#define TOSTRING(X) STRINGIFY(X)

include/kllvm/ast/AST.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,10 @@ enum class sort_category {
132132
Bool,
133133
Symbol,
134134
Variable,
135-
MInt,
136-
RangeMap
135+
RangeMap,
136+
SetIter,
137+
MapIter,
138+
MInt
137139
};
138140

139141
// represents the syntactic category of an LLVM backend term at runtime

lib/ast/AST.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -255,17 +255,20 @@ std::string kore_symbol::layout_string(kore_definition *definition) const {
255255
value_type cat = sort->get_category(definition);
256256
switch (cat.cat) {
257257
case sort_category::Map: result.push_back('1'); break;
258-
case sort_category::RangeMap: result.push_back('b'); break;
259258
case sort_category::List: result.push_back('2'); break;
260259
case sort_category::Set: result.push_back('3'); break;
261260
case sort_category::Int: result.push_back('4'); break;
262261
case sort_category::Float: result.push_back('5'); break;
263262
case sort_category::StringBuffer: result.push_back('6'); break;
264263
case sort_category::Bool: result.push_back('7'); break;
265-
case sort_category::Variable: result.push_back('8'); break;
264+
case sort_category::Symbol: result.push_back('8'); break;
265+
case sort_category::Variable: result.push_back('9'); break;
266+
case sort_category::RangeMap: result.push_back('a'); break;
267+
case sort_category::SetIter: result.push_back('b'); break;
268+
case sort_category::MapIter: result.push_back('c'); break;
266269
case sort_category::MInt:
267270
result.append("_" + std::to_string(cat.bits) + "_");
268-
case sort_category::Symbol: result.push_back('0'); break;
271+
break;
269272
case sort_category::Uncomputed: abort();
270273
}
271274
}

lib/codegen/CreateStaticTerm.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,8 @@ create_static_term::create_token(value_type sort, std::string contents) {
340340
global, llvm::PointerType::getUnqual(llvm::StructType::getTypeByName(
341341
module_->getContext(), block_struct)));
342342
}
343+
case sort_category::SetIter:
344+
case sort_category::MapIter:
343345
case sort_category::Uncomputed: abort();
344346
}
345347
}

lib/codegen/CreateTerm.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,8 @@ llvm::Type *getvalue_type(value_type sort, llvm::Module *module) {
184184
case sort_category::Variable:
185185
return llvm::PointerType::getUnqual(
186186
llvm::StructType::getTypeByName(module->getContext(), block_struct));
187+
case sort_category::MapIter:
188+
case sort_category::SetIter:
187189
case sort_category::Uncomputed: abort();
188190
}
189191
}

lib/codegen/Debug.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ llvm::DIType *get_forward_decl(std::string const &name) {
152152
}
153153

154154
static std::string map_struct = "map";
155+
static std::string iter_struct = "iter";
155156
static std::string rangemap_struct = "rangemap";
156157
static std::string list_struct = "list";
157158
static std::string set_struct = "set";
@@ -166,9 +167,11 @@ llvm::DIType *get_debug_type(value_type type, std::string const &type_name) {
166167
}
167168
static std::map<std::string, llvm::DIType *> types;
168169
llvm::DIType *map = nullptr;
170+
llvm::DIType *mapiter = nullptr;
169171
llvm::DIType *rangemap = nullptr;
170172
llvm::DIType *list = nullptr;
171173
llvm::DIType *set = nullptr;
174+
llvm::DIType *setiter = nullptr;
172175
llvm::DIType *integer = nullptr;
173176
llvm::DIType *floating = nullptr;
174177
llvm::DIType *buffer = nullptr;
@@ -183,6 +186,10 @@ llvm::DIType *get_debug_type(value_type type, std::string const &type_name) {
183186
map = get_pointer_debug_type(get_forward_decl(map_struct), type_name);
184187
types[type_name] = map;
185188
return map;
189+
case sort_category::MapIter:
190+
mapiter = get_pointer_debug_type(get_forward_decl(iter_struct), type_name);
191+
types[type_name] = mapiter;
192+
return mapiter;
186193
case sort_category::RangeMap:
187194
rangemap
188195
= get_pointer_debug_type(get_forward_decl(rangemap_struct), type_name);
@@ -196,6 +203,10 @@ llvm::DIType *get_debug_type(value_type type, std::string const &type_name) {
196203
set = get_pointer_debug_type(get_forward_decl(set_struct), type_name);
197204
types[type_name] = set;
198205
return set;
206+
case sort_category::SetIter:
207+
setiter = get_pointer_debug_type(get_forward_decl(iter_struct), type_name);
208+
types[type_name] = setiter;
209+
return setiter;
199210
case sort_category::Int:
200211
integer = get_pointer_debug_type(get_forward_decl(int_struct), type_name);
201212
types[type_name] = integer;

lib/codegen/Decision.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ void make_pattern_node::codegen(decision *d) {
385385
* the sort that they originated from (int, bool, symbol, ...). In LLVM versions
386386
* < 16, we could encode this information in the LLVM type safely. However,
387387
* after the LLVM opaque pointer migration, we can no longer do so (as the
388-
* legacy types %mpz* and %block* would both be %ptr, for example). We
388+
* legacy types %mpz* and %block* would both be ptr, for example). We
389389
* therefore define a compatibility translation between sort categories and what
390390
* their corresponding LLVM type _would have been_ before opaque pointers.
391391
*/
@@ -400,9 +400,11 @@ static std::string legacy_value_type_to_string(value_type sort) {
400400
// Cases below are deliberately not implemented; the return values are
401401
// placeholders to help with debugging only.
402402
case sort_category::Map: return "<map>";
403+
case sort_category::MapIter: return "<mapiter>";
403404
case sort_category::RangeMap: return "<rangemap>";
404405
case sort_category::List: return "<list>";
405406
case sort_category::Set: return "<set>";
407+
case sort_category::SetIter: return "<setiter>";
406408
case sort_category::StringBuffer: return "<stringbuffer>";
407409
case sort_category::MInt: return "<mint>";
408410
case sort_category::Uncomputed: abort();
@@ -1084,6 +1086,8 @@ std::pair<std::vector<llvm::Value *>, llvm::BasicBlock *> step_function_header(
10841086
break;
10851087
case sort_category::Bool:
10861088
case sort_category::MInt: break;
1089+
case sort_category::MapIter:
1090+
case sort_category::SetIter:
10871091
case sort_category::Uncomputed: abort();
10881092
}
10891093
i++;
@@ -1120,6 +1124,8 @@ std::pair<std::vector<llvm::Value *>, llvm::BasicBlock *> step_function_header(
11201124
break;
11211125
case sort_category::Bool:
11221126
case sort_category::MInt: break;
1127+
case sort_category::MapIter:
1128+
case sort_category::SetIter:
11231129
case sort_category::Uncomputed: abort();
11241130
}
11251131
}

lib/codegen/EmitConfigParser.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,8 @@ static llvm::Value *get_arg_value(
346346
case sort_category::Variable:
347347
arg = new llvm::BitCastInst(arg, getvalue_type(cat, mod), "", case_block);
348348
break;
349+
case sort_category::MapIter:
350+
case sort_category::SetIter:
349351
case sort_category::Uncomputed: abort();
350352
}
351353
return arg;
@@ -402,6 +404,8 @@ static std::pair<llvm::Value *, llvm::BasicBlock *> get_eval(
402404
creator.get_current_block());
403405
break;
404406
}
407+
case sort_category::MapIter:
408+
case sort_category::SetIter:
405409
case sort_category::Uncomputed: abort();
406410
}
407411
inst->insertAfter(&creator.get_current_block()->back());
@@ -628,6 +632,8 @@ static void emit_get_token(kore_definition *definition, llvm::Module *module) {
628632
}
629633
case sort_category::Variable:
630634
case sort_category::Symbol: break;
635+
case sort_category::MapIter:
636+
case sort_category::SetIter:
631637
case sort_category::Uncomputed: abort();
632638
}
633639
current_block = false_block;
@@ -1171,6 +1177,8 @@ static void get_visitor(
11711177
callbacks.at(2), state_ptr, use_sort_name);
11721178
break;
11731179
}
1180+
case sort_category::MapIter:
1181+
case sort_category::SetIter:
11741182
case sort_category::Uncomputed: abort();
11751183
}
11761184
if (i != symbol->get_arguments().size() - 1 && use_sort_name) {

0 commit comments

Comments
 (0)