Skip to content

Commit 722605a

Browse files
committed
Merge remote-tracking branch 'origin/develop'
2 parents 6051aaa + 7c3ed68 commit 722605a

File tree

8 files changed

+61
-177
lines changed

8 files changed

+61
-177
lines changed

include/kllvm/codegen/Util.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#ifndef KLLVM_UTIL_H
22
#define KLLVM_UTIL_H
33

4+
#include <kllvm/ast/AST.h>
5+
46
#include <llvm/Config/llvm-config.h>
57
#include <llvm/IR/Constants.h>
68
#include <llvm/IR/DerivedTypes.h>
@@ -38,6 +40,8 @@ llvm::Function *get_or_insert_function(llvm::Module *module, Ts &&...args) {
3840
return func;
3941
}
4042

43+
char const *get_collection_alloc_fn(sort_category cat);
44+
4145
} // namespace kllvm
4246

4347
#endif // KLLVM_UTIL_H

include/runtime/collect.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,6 @@ void migrate_set(void *s);
3939
void migrate_collection_node(void **node_ptr);
4040
void set_kore_memory_functions_for_gmp(void);
4141
void kore_collect(void **, uint8_t, layoutitem *);
42-
void store_map_for_gc(void **, map *);
43-
void store_set_for_gc(void **, set *);
44-
void store_list_for_gc(void **, list *);
45-
void store_rangemap_for_gc(void **, rangemap *);
46-
map *load_map_for_gc(void **);
47-
set *load_set_for_gc(void **);
48-
list *load_list_for_gc(void **);
49-
rangemap *load_rangemap_for_gc(void **);
5042
}
5143

5244
#ifdef GC_DBG

lib/codegen/CreateTerm.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -777,8 +777,8 @@ llvm::Value *create_term::create_function_call(
777777
if (sret) {
778778
// we don't use alloca here because the tail call optimization pass for llvm
779779
// doesn't handle correctly functions with alloca
780-
alloc_sret
781-
= allocate_term(return_type, current_block_, "kore_alloc_always_gc");
780+
alloc_sret = allocate_term(
781+
return_type, current_block_, get_collection_alloc_fn(return_cat.cat));
782782
sret_type = return_type;
783783
real_args.insert(real_args.begin(), alloc_sret);
784784
types.insert(types.begin(), alloc_sret->getType());
@@ -1244,7 +1244,7 @@ std::string make_apply_rule_function(
12441244
if (!arg->getType()->isPointerTy()) {
12451245
auto *ptr = allocate_term(
12461246
arg->getType(), creator.get_current_block(),
1247-
"kore_alloc_always_gc");
1247+
get_collection_alloc_fn(cat.cat));
12481248
new llvm::StoreInst(arg, ptr, creator.get_current_block());
12491249
arg = ptr;
12501250
}

lib/codegen/Decision.cpp

Lines changed: 7 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -904,7 +904,8 @@ void add_owise(
904904
->get_category(d);
905905
if (is_collection_sort(return_sort)) {
906906
auto *temp_alloc = allocate_term(
907-
retval->getType(), creator.get_current_block(), "kore_alloc_always_gc");
907+
retval->getType(), creator.get_current_block(),
908+
get_collection_alloc_fn(return_sort.cat));
908909
new llvm::StoreInst(retval, temp_alloc, creator.get_current_block());
909910
retval = temp_alloc;
910911
}
@@ -929,58 +930,16 @@ static void store_ptrs_for_gc(
929930
std::vector<std::pair<llvm::Value *, llvm::Type *>> &root_ptrs) {
930931
auto *zero
931932
= llvm::ConstantInt::get(llvm::Type::getInt64Ty(module->getContext()), 0);
932-
llvm::Type *voidptrptr = llvm::PointerType::getUnqual(
933-
llvm::PointerType::getUnqual(module->getContext()));
934933
for (unsigned i = 0; i < nroots; i++) {
935934
auto *ptr = llvm::GetElementPtrInst::CreateInBounds(
936935
root_ty, arr,
937936
{zero, llvm::ConstantInt::get(
938937
llvm::Type::getInt64Ty(module->getContext()), i)},
939938
"", collect);
940-
switch (types[i].cat) {
941-
case sort_category::Map:
942-
llvm::CallInst::Create(
943-
get_or_insert_function(
944-
module, "store_map_for_gc",
945-
llvm::Type::getInt1Ty(module->getContext()), voidptrptr,
946-
ptr_types[i]),
947-
{ptr, roots[i]}, "", collect);
948-
root_ptrs.emplace_back(ptr, ptr_types[i]);
949-
break;
950-
case sort_category::RangeMap:
951-
llvm::CallInst::Create(
952-
get_or_insert_function(
953-
module, "store_rangemap_for_gc",
954-
llvm::Type::getInt1Ty(module->getContext()), voidptrptr,
955-
ptr_types[i]),
956-
{ptr, roots[i]}, "", collect);
957-
root_ptrs.emplace_back(ptr, ptr_types[i]);
958-
break;
959-
case sort_category::List:
960-
llvm::CallInst::Create(
961-
get_or_insert_function(
962-
module, "store_list_for_gc",
963-
llvm::Type::getInt1Ty(module->getContext()), voidptrptr,
964-
ptr_types[i]),
965-
{ptr, roots[i]}, "", collect);
966-
root_ptrs.emplace_back(ptr, ptr_types[i]);
967-
break;
968-
case sort_category::Set:
969-
llvm::CallInst::Create(
970-
get_or_insert_function(
971-
module, "store_set_for_gc",
972-
llvm::Type::getInt1Ty(module->getContext()), voidptrptr,
973-
ptr_types[i]),
974-
{ptr, roots[i]}, "", collect);
975-
root_ptrs.emplace_back(ptr, ptr_types[i]);
976-
break;
977-
default:
978-
auto *casted = new llvm::BitCastInst(
979-
ptr, llvm::PointerType::getUnqual(ptr_types[i]), "", collect);
980-
new llvm::StoreInst(roots[i], casted, collect);
981-
root_ptrs.emplace_back(casted, ptr_types[i]);
982-
break;
983-
}
939+
auto *casted = new llvm::BitCastInst(
940+
ptr, llvm::PointerType::getUnqual(ptr_types[i]), "", collect);
941+
new llvm::StoreInst(roots[i], casted, collect);
942+
root_ptrs.emplace_back(casted, ptr_types[i]);
984943
}
985944
}
986945

@@ -992,42 +951,9 @@ static void load_ptrs_for_gc(
992951
std::vector<llvm::Value *> &phis, std::vector<llvm::Value *> const &roots,
993952
std::vector<std::pair<llvm::Value *, llvm::Type *>> const &root_ptrs,
994953
std::vector<value_type> const &types) {
995-
llvm::Type *voidptrptr = llvm::PointerType::getUnqual(
996-
llvm::PointerType::getUnqual(module->getContext()));
997954
unsigned i = 0;
998955
for (auto [ptr, pointee_ty] : root_ptrs) {
999-
llvm::Value *loaded = nullptr;
1000-
switch (types[i].cat) {
1001-
case sort_category::Map:
1002-
loaded = llvm::CallInst::Create(
1003-
get_or_insert_function(
1004-
module, "load_map_for_gc", pointee_ty, voidptrptr,
1005-
llvm::Type::getInt1Ty(module->getContext())),
1006-
{ptr}, "", collect);
1007-
break;
1008-
case sort_category::RangeMap:
1009-
loaded = llvm::CallInst::Create(
1010-
get_or_insert_function(
1011-
module, "load_rangemap_for_gc", pointee_ty, voidptrptr,
1012-
llvm::Type::getInt1Ty(module->getContext())),
1013-
{ptr}, "", collect);
1014-
break;
1015-
case sort_category::List:
1016-
loaded = llvm::CallInst::Create(
1017-
get_or_insert_function(
1018-
module, "load_list_for_gc", pointee_ty, voidptrptr,
1019-
llvm::Type::getInt1Ty(module->getContext())),
1020-
{ptr}, "", collect);
1021-
break;
1022-
case sort_category::Set:
1023-
loaded = llvm::CallInst::Create(
1024-
get_or_insert_function(
1025-
module, "load_set_for_gc", pointee_ty, voidptrptr,
1026-
llvm::Type::getInt1Ty(module->getContext())),
1027-
{ptr}, "", collect);
1028-
break;
1029-
default: loaded = new llvm::LoadInst(pointee_ty, ptr, "", collect);
1030-
}
956+
llvm::Value *loaded = new llvm::LoadInst(pointee_ty, ptr, "", collect);
1031957
auto *phi = llvm::PHINode::Create(loaded->getType(), 2, "phi", merge);
1032958
phi->addIncoming(loaded, collect);
1033959
phi->addIncoming(roots[i++], check_collect);

lib/codegen/Util.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,14 @@ llvm::Constant *get_offset_of_member(
5858
#endif
5959
}
6060

61+
char const *get_collection_alloc_fn(sort_category cat) {
62+
switch (cat) {
63+
case sort_category::Map: return "kore_alloc_map";
64+
case sort_category::Set: return "kore_alloc_set";
65+
case sort_category::List: return "kore_alloc_list";
66+
case sort_category::RangeMap: return "kore_alloc_rangemap";
67+
default: abort();
68+
}
69+
}
70+
6171
} // namespace kllvm

runtime/alloc/alloc.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,4 +157,37 @@ __attribute__((always_inline)) void *kore_alloc_floating_old(size_t requested) {
157157
init_with_len(result, sizeof(floating_hdr) - sizeof(blockheader));
158158
return &result->f;
159159
}
160+
161+
extern "C++" {
162+
template <typename collection>
163+
static inline void *kore_alloc_collection(kllvm::sort_category cat) {
164+
void *mem
165+
= kore_alloc(sizeof(blockheader) + sizeof(collection) + sizeof(uint64_t));
166+
auto *hdr = (blockheader *)mem;
167+
static std::string name = get_raw_symbol_name(cat) + "{}";
168+
static blockheader hdr_val
169+
= get_block_header_for_symbol(get_tag_for_symbol_name(name.c_str()));
170+
*hdr = hdr_val;
171+
auto *offset = (uint64_t *)(hdr + 1);
172+
*offset = 16;
173+
auto *child = hdr + 2;
174+
return child;
175+
}
176+
}
177+
178+
void *kore_alloc_map(size_t requested) {
179+
return kore_alloc_collection<map>(kllvm::sort_category::Map);
180+
}
181+
182+
void *kore_alloc_set(size_t requested) {
183+
return kore_alloc_collection<set>(kllvm::sort_category::Set);
184+
}
185+
186+
void *kore_alloc_list(size_t requested) {
187+
return kore_alloc_collection<list>(kllvm::sort_category::List);
188+
}
189+
190+
void *kore_alloc_rangemap(size_t requested) {
191+
return kore_alloc_collection<rangemap>(kllvm::sort_category::RangeMap);
192+
}
160193
}

runtime/collect/collect.cpp

Lines changed: 0 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -360,89 +360,4 @@ bool is_collection() {
360360
size_t threshold = get_gc_threshold();
361361
return youngspace_almost_full(threshold);
362362
}
363-
364-
void store_map_for_gc(void **roots, map *ptr) {
365-
if (get_arena_semispace_id_of_object(ptr) != ALWAYSGCSPACE_ID) {
366-
*roots = ptr;
367-
return;
368-
}
369-
void *mem = kore_alloc(sizeof(blockheader) + sizeof(map) + sizeof(uint64_t));
370-
auto *hdr = (blockheader *)mem;
371-
std::string name = get_raw_symbol_name(kllvm::sort_category::Map) + "{}";
372-
*hdr = get_block_header_for_symbol(get_tag_for_symbol_name(name.c_str()));
373-
auto *offset = (uint64_t *)(hdr + 1);
374-
*offset = 16;
375-
auto *child = (map *)(hdr + 2);
376-
*child = std::move(*ptr);
377-
*roots = child;
378-
}
379-
380-
void store_set_for_gc(void **roots, set *ptr) {
381-
if (get_arena_semispace_id_of_object(ptr) != ALWAYSGCSPACE_ID) {
382-
*roots = ptr;
383-
return;
384-
}
385-
void *mem = kore_alloc(sizeof(blockheader) + sizeof(set) + sizeof(uint64_t));
386-
auto *hdr = (blockheader *)mem;
387-
std::string name = get_raw_symbol_name(kllvm::sort_category::Set) + "{}";
388-
*hdr = get_block_header_for_symbol(get_tag_for_symbol_name(name.c_str()));
389-
auto *offset = (uint64_t *)(hdr + 1);
390-
*offset = 16;
391-
auto *child = (set *)(hdr + 2);
392-
*child = std::move(*ptr);
393-
*roots = child;
394-
}
395-
396-
void store_list_for_gc(void **roots, list *ptr) {
397-
if (get_arena_semispace_id_of_object(ptr) != ALWAYSGCSPACE_ID) {
398-
*roots = ptr;
399-
return;
400-
}
401-
void *mem = kore_alloc(sizeof(blockheader) + sizeof(list) + sizeof(uint64_t));
402-
auto *hdr = (blockheader *)mem;
403-
std::string name = get_raw_symbol_name(kllvm::sort_category::List) + "{}";
404-
*hdr = get_block_header_for_symbol(get_tag_for_symbol_name(name.c_str()));
405-
auto *offset = (uint64_t *)(hdr + 1);
406-
*offset = 16;
407-
auto *child = (list *)(hdr + 2);
408-
*child = std::move(*ptr);
409-
*roots = child;
410-
}
411-
412-
void store_rangemap_for_gc(void **roots, rangemap *ptr) {
413-
if (get_arena_semispace_id_of_object(ptr) != ALWAYSGCSPACE_ID) {
414-
*roots = ptr;
415-
return;
416-
}
417-
void *mem
418-
= kore_alloc(sizeof(blockheader) + sizeof(rangemap) + sizeof(uint64_t));
419-
auto *hdr = (blockheader *)mem;
420-
std::string name = get_raw_symbol_name(kllvm::sort_category::RangeMap) + "{}";
421-
*hdr = get_block_header_for_symbol(get_tag_for_symbol_name(name.c_str()));
422-
auto *offset = (uint64_t *)(hdr + 1);
423-
*offset = 16;
424-
auto *child = (rangemap *)(hdr + 2);
425-
*child = std::move(*ptr);
426-
*roots = child;
427-
}
428-
429-
map *load_map_for_gc(void **roots) {
430-
void *mem = *roots;
431-
return (map *)mem;
432-
}
433-
434-
set *load_set_for_gc(void **roots) {
435-
void *mem = *roots;
436-
return (set *)mem;
437-
}
438-
439-
list *load_list_for_gc(void **roots) {
440-
void *mem = *roots;
441-
return (list *)mem;
442-
}
443-
444-
rangemap *load_rangemap_for_gc(void **roots) {
445-
void *mem = *roots;
446-
return (rangemap *)mem;
447-
}
448363
}

unittests/runtime-strings/stringtest.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ floating *move_float(floating *i) {
6767
}
6868

6969
void add_hash64(void *, uint64_t) { }
70+
71+
struct blockheader get_block_header_for_symbol(uint32_t tag) {
72+
return blockheader{tag};
73+
}
7074
}
7175

7276
BOOST_AUTO_TEST_SUITE(StringTest)

0 commit comments

Comments
 (0)