为什么gcc或clang不能正确编码SIMD矢量类型?

时间:2014-04-09 10:34:25

标签: objective-c vector clang simd objective-c-runtime

在对矢量类型和ObjC运行时进行一些处理时,我遇到了一个非常令人困惑的问题。

据我所知,clang或GCC都不会为任何SIMD矢量类型提供'正确'的类型编码。

#import <Foundation/Foundation.h>

int main() {
    typedef int int4 __attribute__((vector_size(16)));
    typedef float float4 __attribute__((vector_size(16)));

    NSLog(@"Int4: %s", @encode(int4));
    NSLog(@"Float4: %s", @encode(float4));
}

编译时&amp;使用GCC或clang运行,我得到以下输出:

2014-04-09 06:21:01.102 test[1707:507] Int4:
2014-04-09 06:21:01.103 test[1707:507] Float4:

而不是我期望的,这将是这样的:

2014-04-09 06:21:01.102 test[1707:507] Int4: ![16,16i]
2014-04-09 06:21:01.103 test[1707:507] Float4: ![16,16f]

根据文档here

  

vectors'!['后跟vector_size(构成向量的字节数),后跟逗号,后跟向量的对齐方式(以字节为单位),后跟元素的类型,后跟']'

尝试从ObjC方法返回这些类型时会出现问题,而不是像![16,16i]@:这样的逻辑来获取以下方法的编码:

-(int4) foo;

我只收到字符串@:,这会导致NSMethodSignatureNSInvocation基本上废弃他们的裤子和段错误。

是否有一些编译器选项可以启用以恢复矢量类型的正确编码?或者这里唯一的解决方案是“不从ObjC方法返回向量”?

注意:返回(或传递)指向矢量的指针也无济于事,因为指针到矢量的编码只是^,然后贪婪地 - 匹配列表中的下一个参数,导致我的参数计数再次关闭。我想我可以将矢量转换为void *,但那时真的是一个丑陋的黑客。

1 个答案:

答案 0 :(得分:3)

看起来这是一个已知问题,在这种情况下,clang显然已被修改为显示警告:https://github.com/llvm-mirror/clang/commit/024d9c65e9d3887045c82be09e4f630f19da48b4