Skip to content

Commit 332b771

Browse files
committed
Prevent segmentation faults in particular cases of read checking
1 parent 5a66456 commit 332b771

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed

integration_tests/test_membership_01.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def test_str_set():
3535
a: set[str] = {'a', 'b', 'c', 'e', 'f'}
3636
i: str
3737
assert ('a' in a)
38-
# assert ('d' not in a)
38+
assert ('d' not in a)
3939
i = 'c'
4040
assert (i in a)
4141

src/libasr/codegen/llvm_utils.cpp

+14-3
Original file line numberDiff line numberDiff line change
@@ -3393,8 +3393,13 @@ namespace LCompilers {
33933393
module, key_asr_type, true);
33943394
}
33953395
llvm_utils->start_new_block(mergeBB);
3396-
llvm::Value *flag = LLVM::CreateLoad(*builder, flag_ptr);
33973396
llvm::Value *pos = LLVM::CreateLoad(*builder, pos_ptr);
3397+
llvm::Value* pos_mask_value = LLVM::CreateLoad(*builder,
3398+
llvm_utils->create_ptr_gep(key_mask, pos));
3399+
llvm::Value *flag = builder->CreateOr(
3400+
builder->CreateICmpEQ(pos_mask_value,
3401+
llvm::ConstantInt::get(llvm::Type::getInt8Ty(context), llvm::APInt(8, 0))),
3402+
LLVM::CreateLoad(*builder, flag_ptr));
33983403
llvm::AllocaInst *is_key_matching_ptr = builder0.CreateAlloca(llvm::Type::getInt1Ty(context), nullptr);
33993404

34003405
llvm_utils->create_if_else(flag, [&](){
@@ -6783,14 +6788,20 @@ namespace LCompilers {
67836788
module, el_asr_type, true);
67846789
}
67856790
llvm_utils->start_new_block(mergeBB);
6786-
llvm::Value *flag = LLVM::CreateLoad(*builder, flag_ptr);
6791+
6792+
llvm::Value* pos = LLVM::CreateLoad(*builder, pos_ptr);
6793+
llvm::Value* pos_mask_value = LLVM::CreateLoad(*builder,
6794+
llvm_utils->create_ptr_gep(el_mask, pos));
6795+
llvm::Value *flag = builder->CreateOr(
6796+
builder->CreateICmpEQ(pos_mask_value,
6797+
llvm::ConstantInt::get(llvm::Type::getInt8Ty(context), llvm::APInt(8, 0))),
6798+
LLVM::CreateLoad(*builder, flag_ptr));
67876799
llvm::AllocaInst *is_el_matching_ptr = builder0.CreateAlloca(llvm::Type::getInt1Ty(context), nullptr);
67886800

67896801
llvm_utils->create_if_else(flag, [&](){
67906802
LLVM::CreateStore(*builder, llvm::ConstantInt::get(llvm::Type::getInt1Ty(context), 0), is_el_matching_ptr);
67916803
}, [&](){
67926804
// Check if the actual element is present or not
6793-
llvm::Value* pos = LLVM::CreateLoad(*builder, pos_ptr);
67946805
llvm::Value* item = llvm_utils->list_api->read_item(el_list, pos, false, module,
67956806
LLVM::is_llvm_struct(el_asr_type)) ;
67966807
llvm::Value *iseq =llvm_utils->is_equal_by_value(el,

0 commit comments

Comments
 (0)