@@ -91,6 +91,7 @@ declare void @buffer_overflow_replace_at(i64, i64, i64)
91
91
declare void @buffer_overflow_update(i64, i64)
92
92
declare void @error_on_update(i64)
93
93
declare i1 @hook_BYTES_mutableBytesEnabled()
94
+ declare i64 @hook_BYTES_length64(ptr)
94
95
95
96
define ptr @copy_if_needed_in_llvm(ptr %b) {
96
97
entry:
@@ -101,8 +102,7 @@ return_b:
101
102
ret ptr %b
102
103
103
104
copy_needed:
104
- %hdr = load i64, ptr %b
105
- %len = and i64 %hdr, 1099511627775 ; @LENGTH_MASK@
105
+ %len = call i64 @hook_BYTES_length64(ptr %b)
106
106
%len_bytes = mul i64 %len, 8 ; 8 bytes per byte
107
107
%alloc_size = add i64 %len_bytes, 40 ; 8 bytes for header, rest for data
108
108
%alloc = call ptr @kore_alloc(i64 %alloc_size)
@@ -294,8 +294,7 @@ entry:
294
294
define i256 @hook_BYTES_get256(ptr %b, i256 %off) {
295
295
entry:
296
296
; Check for buffer overflow
297
- %hdr = load i64, ptr %b
298
- %len = and i64 %hdr, 1099511627775 ; @LENGTH_MASK@
297
+ %len = call i64 @hook_BYTES_length64(ptr %b)
299
298
%len_256 = zext i64 %len to i256
300
299
%off_lt_len = icmp ult i256 %off, %len_256
301
300
br i1 %off_lt_len, label %valid_off, label %overflow
@@ -324,8 +323,7 @@ error:
324
323
call void @error_on_start_substr(i64 %start_trunc, i64 %end_trunc)
325
324
unreachable
326
325
check_length:
327
- %input_hdr = load i64, ptr %input
328
- %input_len = and i64 %input_hdr, 1099511627775 ; @LENGTH_MASK@
326
+ %input_len = call i64 @hook_BYTES_length64(ptr %input)
329
327
%input_len_256 = zext i64 %input_len to i256
330
328
%end_gt_input_len = icmp ugt i256 %end, %input_len_256
331
329
br i1 %end_gt_input_len, label %error_length, label %calculate_length
@@ -357,16 +355,14 @@ calculate_length:
357
355
358
356
define i256 @hook_BYTES_length256(ptr %b) {
359
357
entry:
360
- %hdr = load i64, ptr %b
361
- %len = and i64 %hdr, 1099511627775 ; @LENGTH_MASK@
358
+ %len = call i64 @hook_BYTES_length64(ptr %b)
362
359
%len_256 = zext i64 %len to i256
363
360
ret i256 %len_256
364
361
}
365
362
366
363
define ptr @hook_BYTES_padRight256(ptr %b, i256 %length, i256 %v) {
367
364
entry:
368
- %hdr = load i64, ptr %b
369
- %len = and i64 %hdr, 1099511627775 ; @LENGTH_MASK@
365
+ %len = call i64 @hook_BYTES_length64(ptr %b)
370
366
%len_256 = zext i64 %len to i256
371
367
%length_gt_len = icmp ugt i256 %length, %len_256
372
368
br i1 %length_gt_len, label %pad, label %return_b
@@ -407,8 +403,7 @@ allocate:
407
403
408
404
define ptr @hook_BYTES_padLeft256(ptr %b, i256 %length, i256 %v) {
409
405
entry:
410
- %hdr = load i64, ptr %b
411
- %len = and i64 %hdr, 1099511627775 ; @LENGTH_MASK@
406
+ %len = call i64 @hook_BYTES_length64(ptr %b)
412
407
%len_256 = zext i64 %len to i256
413
408
%length_gt_len = icmp ugt i256 %length, %len_256
414
409
br i1 %length_gt_len, label %pad, label %return_b
@@ -451,12 +446,10 @@ define ptr @hook_BYTES_replaceAt256(ptr %dest, i256 %index, ptr %src) {
451
446
entry:
452
447
call ptr @copy_if_needed_in_llvm(ptr %dest)
453
448
454
- %dest_hdr = load i64, ptr %dest
455
- %dest_len = and i64 %dest_hdr, 1099511627775 ; @LENGTH_MASK@
449
+ %dest_len = call i64 @hook_BYTES_length64(ptr %dest)
456
450
%dest_len_256 = zext i64 %dest_len to i256
457
451
458
- %src_hdr = load i64, ptr %src
459
- %src_len = and i64 %src_hdr, 1099511627775 ; @LENGTH_MASK@
452
+ %src_len = call i64 @hook_BYTES_length64(ptr %src)
460
453
%src_len_256 = zext i64 %src_len to i256
461
454
462
455
%index_sum_dest_src = add i256 %index, %src_len_256
@@ -538,8 +531,7 @@ define ptr @hook_BYTES_update256(ptr %b, i256 %index, i256 %value) {
538
531
entry:
539
532
call ptr @copy_if_needed_in_llvm(ptr %b)
540
533
541
- %hdr = load i64, ptr %b
542
- %len = and i64 %hdr, 1099511627775 ; @LENGTH_MASK@
534
+ %len = call i64 @hook_BYTES_length64(ptr %b)
543
535
%len_256 = zext i64 %len to i256
544
536
545
537
%index_uge_len = icmp uge i256 %index, %len_256
0 commit comments