Skip to content

Commit 8de2bf4

Browse files
deadprogramclaude
andcommitted
interp: defer constant ptrtoint to non-byte-sized integers
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent cee56fd commit 8de2bf4

3 files changed

Lines changed: 10 additions & 0 deletions

File tree

‎interp/memory.go‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,6 +1035,10 @@ func (v *rawValue) set(llvmValue llvm.Value, r *runner) bool {
10351035
if src.len(r) != size && src.hasPointer() {
10361036
return false
10371037
}
1038+
if llvmValue.Type().TypeKind() == llvm.IntegerTypeKind && uint32(llvmValue.Type().IntTypeWidth()) != size*8 {
1039+
// Widths like i1 don't fill their bytes, so leave them for runtime.
1040+
return false
1041+
}
10381042
copy(v.buf[:size], src.buf)
10391043
case llvm.GetElementPtr:
10401044
ptr := llvmValue.Operand(0)

‎interp/testdata/ptrtoint.ll‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ target triple = "x86_64--linux"
99
@main.v5 = global i8 0
1010
@main.v6 = global { i8, i8 } { i8 ptrtoint (ptr @main.global to i8), i8 7 }
1111
@main.v7 = global i8 0
12+
@main.v8 = global i1 0
1213

1314
define void @runtime.initAll() unnamed_addr {
1415
entry:
@@ -38,6 +39,9 @@ entry:
3839
; A global whose initializer can't be computed at compile time.
3940
%v7 = load i8, ptr getelementptr inbounds (i8, ptr @main.v6, i64 1)
4041
store i8 %v7, ptr @main.v7
42+
43+
; A result narrower than its allocation size is left for runtime.
44+
store i1 ptrtoint (ptr inttoptr (i64 2 to ptr) to i1), ptr @main.v8
4145
ret void
4246
}
4347

‎interp/testdata/ptrtoint.out.ll‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@ target triple = "x86_64--linux"
99
@main.v5 = local_unnamed_addr global i8 0
1010
@main.v6 = local_unnamed_addr global { i8, i8 } { i8 ptrtoint (ptr @main.global to i8), i8 7 }
1111
@main.v7 = local_unnamed_addr global i8 0
12+
@main.v8 = local_unnamed_addr global i1 false
1213

1314
define void @runtime.initAll() unnamed_addr {
1415
entry:
1516
store i8 ptrtoint (ptr @main.global to i8), ptr @main.v3, align 1
1617
store i8 ptrtoint (ptr @main.global to i8), ptr @main.v5, align 1
1718
%v7 = load i8, ptr getelementptr inbounds (i8, ptr @main.v6, i64 1), align 1
1819
store i8 %v7, ptr @main.v7, align 1
20+
store i1 ptrtoint (ptr inttoptr (i64 2 to ptr) to i1), ptr @main.v8, align 1
1921
ret void
2022
}

0 commit comments

Comments
 (0)