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.
Этот коммит содержится в:
		
							родитель
							
								
									17176a2cea
								
							
						
					
					
						коммит
						f9d0ff3bec
					
				
					 4 изменённых файлов: 23 добавлений и 3 удалений
				
			
		|  | @ -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] | ||||
| 	} | ||||
| } | ||||
|  |  | |||
							
								
								
									
										4
									
								
								compiler/testdata/gc.ll
									
										
									
									
										предоставленный
									
									
								
							
							
						
						
									
										4
									
								
								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 } | ||||
| 
 | ||||
|  |  | |||
|  | @ -1289,6 +1289,7 @@ func (r *runner) readObjectLayout(layoutValue value) (uint64, *big.Int) { | |||
| 		} | ||||
| 		rawBytes[i] = byte(v) | ||||
| 	} | ||||
| 	reverseBytes(rawBytes) // little-endian to big-endian | ||||
| 	bitmap := new(big.Int).SetBytes(rawBytes) | ||||
| 	return objectSizeWords, bitmap | ||||
| } | ||||
|  | @ -1338,3 +1339,12 @@ func (r *runner) getLLVMTypeFromLayout(layoutValue value) llvm.Type { | |||
| 	} | ||||
| 	return llvmLayoutType | ||||
| } | ||||
| 
 | ||||
| // 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] | ||||
| 	} | ||||
| } | ||||
|  |  | |||
							
								
								
									
										2
									
								
								interp/testdata/alloc.ll
									
										
									
									
										предоставленный
									
									
								
							
							
						
						
									
										2
									
								
								interp/testdata/alloc.ll
									
										
									
									
										предоставленный
									
									
								
							|  | @ -1,7 +1,7 @@ | |||
| target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" | ||||
| target triple = "wasm32--wasi" | ||||
| 
 | ||||
| @"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-2000000000000001" = linkonce_odr unnamed_addr constant { i32, [8 x i8] } { i32 62, [8 x i8] c"\01\00\00\00\00\00\00 " } | ||||
| @pointerFree12 = global i8* null | ||||
| @pointerFree7 = global i8* null | ||||
| @pointerFree3 = global i8* null | ||||
|  |  | |||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче
	
	 Ayke van Laethem
						Ayke van Laethem