transform: fix OptimizeReflectImplements pass for new named elem offset
Этот коммит содержится в:
родитель
229f479a7d
коммит
e0329b25de
3 изменённых файлов: 7 добавлений и 7 удалений
|
@ -142,7 +142,7 @@ func OptimizeReflectImplements(mod llvm.Module) {
|
||||||
|
|
||||||
if strings.HasPrefix(interfaceType.Name(), "reflect/types.type:named:") {
|
if strings.HasPrefix(interfaceType.Name(), "reflect/types.type:named:") {
|
||||||
// Get the underlying type.
|
// Get the underlying type.
|
||||||
interfaceType = stripPointerCasts(builder.CreateExtractValue(interfaceType.Initializer(), 2, ""))
|
interfaceType = stripPointerCasts(builder.CreateExtractValue(interfaceType.Initializer(), 3, ""))
|
||||||
}
|
}
|
||||||
if !strings.HasPrefix(interfaceType.Name(), "reflect/types.type:interface:") {
|
if !strings.HasPrefix(interfaceType.Name(), "reflect/types.type:interface:") {
|
||||||
// This is an error. The Type passed to Implements should be of
|
// This is an error. The Type passed to Implements should be of
|
||||||
|
|
6
transform/testdata/reflect-implements.ll
предоставленный
6
transform/testdata/reflect-implements.ll
предоставленный
|
@ -3,11 +3,11 @@ target triple = "i686--linux"
|
||||||
|
|
||||||
%runtime._interface = type { ptr, ptr }
|
%runtime._interface = type { ptr, ptr }
|
||||||
|
|
||||||
@"reflect/types.type:named:error" = internal constant { i8, ptr, ptr } { i8 52, ptr @"reflect/types.type:pointer:named:error", ptr @"reflect/types.type:interface:{Error:func:{}{basic:string}}" }, align 4
|
@"reflect/types.type:named:error" = internal constant { i8, i16, ptr, ptr } { i8 52, i16 0, ptr @"reflect/types.type:pointer:named:error", ptr @"reflect/types.type:interface:{Error:func:{}{basic:string}}" }, align 4
|
||||||
@"reflect/types.type:interface:{Error:func:{}{basic:string}}" = internal constant { i8, ptr } { i8 20, ptr @"reflect/types.type:pointer:interface:{Error:func:{}{basic:string}}" }, align 4
|
@"reflect/types.type:interface:{Error:func:{}{basic:string}}" = internal constant { i8, ptr } { i8 20, ptr @"reflect/types.type:pointer:interface:{Error:func:{}{basic:string}}" }, align 4
|
||||||
@"reflect/types.type:pointer:interface:{Error:func:{}{basic:string}}" = internal constant { i8, ptr } { i8 21, ptr @"reflect/types.type:interface:{Error:func:{}{basic:string}}" }, align 4
|
@"reflect/types.type:pointer:interface:{Error:func:{}{basic:string}}" = internal constant { i8, ptr } { i8 21, ptr @"reflect/types.type:interface:{Error:func:{}{basic:string}}" }, align 4
|
||||||
@"reflect/types.type:pointer:named:error" = internal constant { i8, ptr } { i8 21, ptr @"reflect/types.type:named:error" }, align 4
|
@"reflect/types.type:pointer:named:error" = internal constant { i8, i16, ptr } { i8 21, i16 0, ptr @"reflect/types.type:named:error" }, align 4
|
||||||
@"reflect/types.type:pointer:named:reflect.rawType" = internal constant { ptr, i8, ptr } { ptr null, i8 21, ptr null }, align 4
|
@"reflect/types.type:pointer:named:reflect.rawType" = internal constant { ptr, i8, i16, ptr } { ptr null, i8 21, i16 0, ptr null }, align 4
|
||||||
@"reflect/methods.Implements(reflect.Type) bool" = internal constant i8 0, align 1
|
@"reflect/methods.Implements(reflect.Type) bool" = internal constant i8 0, align 1
|
||||||
|
|
||||||
; var errorType = reflect.TypeOf((*error)(nil)).Elem()
|
; var errorType = reflect.TypeOf((*error)(nil)).Elem()
|
||||||
|
|
6
transform/testdata/reflect-implements.out.ll
предоставленный
6
transform/testdata/reflect-implements.out.ll
предоставленный
|
@ -1,11 +1,11 @@
|
||||||
target datalayout = "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-f80:32-n8:16:32-S128"
|
target datalayout = "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-f80:32-n8:16:32-S128"
|
||||||
target triple = "i686--linux"
|
target triple = "i686--linux"
|
||||||
|
|
||||||
@"reflect/types.type:named:error" = internal constant { i8, ptr, ptr } { i8 52, ptr @"reflect/types.type:pointer:named:error", ptr @"reflect/types.type:interface:{Error:func:{}{basic:string}}" }, align 4
|
@"reflect/types.type:named:error" = internal constant { i8, i16, ptr, ptr } { i8 52, i16 0, ptr @"reflect/types.type:pointer:named:error", ptr @"reflect/types.type:interface:{Error:func:{}{basic:string}}" }, align 4
|
||||||
@"reflect/types.type:interface:{Error:func:{}{basic:string}}" = internal constant { i8, ptr } { i8 20, ptr @"reflect/types.type:pointer:interface:{Error:func:{}{basic:string}}" }, align 4
|
@"reflect/types.type:interface:{Error:func:{}{basic:string}}" = internal constant { i8, ptr } { i8 20, ptr @"reflect/types.type:pointer:interface:{Error:func:{}{basic:string}}" }, align 4
|
||||||
@"reflect/types.type:pointer:interface:{Error:func:{}{basic:string}}" = internal constant { i8, ptr } { i8 21, ptr @"reflect/types.type:interface:{Error:func:{}{basic:string}}" }, align 4
|
@"reflect/types.type:pointer:interface:{Error:func:{}{basic:string}}" = internal constant { i8, ptr } { i8 21, ptr @"reflect/types.type:interface:{Error:func:{}{basic:string}}" }, align 4
|
||||||
@"reflect/types.type:pointer:named:error" = internal constant { i8, ptr } { i8 21, ptr @"reflect/types.type:named:error" }, align 4
|
@"reflect/types.type:pointer:named:error" = internal constant { i8, i16, ptr } { i8 21, i16 0, ptr @"reflect/types.type:named:error" }, align 4
|
||||||
@"reflect/types.type:pointer:named:reflect.rawType" = internal constant { ptr, i8, ptr } { ptr null, i8 21, ptr null }, align 4
|
@"reflect/types.type:pointer:named:reflect.rawType" = internal constant { ptr, i8, i16, ptr } { ptr null, i8 21, i16 0, ptr null }, align 4
|
||||||
@"reflect/methods.Implements(reflect.Type) bool" = internal constant i8 0, align 1
|
@"reflect/methods.Implements(reflect.Type) bool" = internal constant i8 0, align 1
|
||||||
|
|
||||||
define i1 @main.isError(ptr %typ.typecode, ptr %typ.value, ptr %context) {
|
define i1 @main.isError(ptr %typ.typecode, ptr %typ.value, ptr %context) {
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче