aboutsummaryrefslogtreecommitdiffhomepage
path: root/compiler/llvm.go
diff options
context:
space:
mode:
authorAyke van Laethem <[email protected]>2022-12-18 22:43:52 +0100
committerAyke <[email protected]>2023-01-17 19:32:18 +0100
commitf9d0ff3becbe6835d32a146895d797d53a09fc15 (patch)
tree4b7712ca2bf3dd5934e9d7fb5a33ece3def7b0f0 /compiler/llvm.go
parent17176a2ceaa9ba9849671c3987588dd212377a8f (diff)
downloadtinygo-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/llvm.go')
-rw-r--r--compiler/llvm.go10
1 files changed, 10 insertions, 0 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]
+ }
+}