diff options
author | Ayke van Laethem <[email protected]> | 2022-12-18 22:43:52 +0100 |
---|---|---|
committer | Ayke <[email protected]> | 2023-01-17 19:32:18 +0100 |
commit | f9d0ff3becbe6835d32a146895d797d53a09fc15 (patch) | |
tree | 4b7712ca2bf3dd5934e9d7fb5a33ece3def7b0f0 /compiler | |
parent | 17176a2ceaa9ba9849671c3987588dd212377a8f (diff) | |
download | tinygo-f9d0ff3becbe6835d32a146895d797d53a09fc15.tar.gz tinygo-f9d0ff3becbe6835d32a146895d797d53a09fc15.zip |
all: store data layout as little endian value
This makes it much easier to read the value at runtime, as pointer
indices are naturally little endian. It should not affect anything else
in the program.
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/llvm.go | 10 | ||||
-rw-r--r-- | compiler/testdata/gc.ll | 4 |
2 files changed, 12 insertions, 2 deletions
diff --git a/compiler/llvm.go b/compiler/llvm.go index 8b80869bf..86c843199 100644 --- a/compiler/llvm.go +++ b/compiler/llvm.go @@ -166,6 +166,7 @@ func (c *compilerContext) createObjectLayout(t llvm.Type, pos token.Pos) llvm.Va // Create the global initializer. bitmapBytes := make([]byte, int(objectSizeWords+7)/8) bitmap.FillBytes(bitmapBytes) + reverseBytes(bitmapBytes) // big-endian to little-endian var bitmapByteValues []llvm.Value for _, b := range bitmapBytes { bitmapByteValues = append(bitmapByteValues, llvm.ConstInt(c.ctx.Int8Type(), uint64(b), false)) @@ -314,3 +315,12 @@ func (b *builder) readStackPointer() llvm.Value { } return b.CreateCall(stacksave.GlobalValueType(), stacksave, nil, "") } + +// Reverse a slice of bytes. From the wiki: +// https://github.com/golang/go/wiki/SliceTricks#reversing +func reverseBytes(buf []byte) { + for i := len(buf)/2 - 1; i >= 0; i-- { + opp := len(buf) - 1 - i + buf[i], buf[opp] = buf[opp], buf[i] + } +} diff --git a/compiler/testdata/gc.ll b/compiler/testdata/gc.ll index e54b207d4..4044ae723 100644 --- a/compiler/testdata/gc.ll +++ b/compiler/testdata/gc.ll @@ -20,8 +20,8 @@ target triple = "wasm32-unknown-wasi" @main.slice1 = hidden global { ptr, i32, i32 } zeroinitializer, align 8 @main.slice2 = hidden global { ptr, i32, i32 } zeroinitializer, align 8 @main.slice3 = hidden global { ptr, i32, i32 } zeroinitializer, align 8 -@"runtime/gc.layout:62-2000000000000001" = linkonce_odr unnamed_addr constant { i32, [8 x i8] } { i32 62, [8 x i8] c" \00\00\00\00\00\00\01" } -@"runtime/gc.layout:62-0001" = linkonce_odr unnamed_addr constant { i32, [8 x i8] } { i32 62, [8 x i8] c"\00\00\00\00\00\00\00\01" } +@"runtime/gc.layout:62-2000000000000001" = linkonce_odr unnamed_addr constant { i32, [8 x i8] } { i32 62, [8 x i8] c"\01\00\00\00\00\00\00 " } +@"runtime/gc.layout:62-0001" = linkonce_odr unnamed_addr constant { i32, [8 x i8] } { i32 62, [8 x i8] c"\01\00\00\00\00\00\00\00" } @"reflect/types.type:basic:complex128" = linkonce_odr constant %runtime.typecodeID { ptr null, i32 0, ptr null, ptr @"reflect/types.type:pointer:basic:complex128", i32 0 } @"reflect/types.type:pointer:basic:complex128" = linkonce_odr constant %runtime.typecodeID { ptr @"reflect/types.type:basic:complex128", i32 0, ptr null, ptr null, i32 0 } |