使用钴版本11,使用NPLB的AlignAsStackVariable测试会失败,但是当我们从nplb测试文件(starboard / nplb / align_test.cc)复制测试代码时,交叉编译并在同一个arm平台上运行,然后它按预期排列,所以它似乎是NPLB的问题(没有工具链或平台的问题),有人可以看看吗?
// NPLB案例失败:
[ RUN ] SbAlignTest.AlignAsStackVariable
../../starboard/nplb/align_test.cc:117: Failure
Expected: (32) <= (GetAlignment(&by_32)), actual: 32 vs 16
../../starboard/nplb/align_test.cc:118: Failure
Expected: (64) <= (GetAlignment(&by_64)), actual: 64 vs 16
../../starboard/nplb/align_test.cc:119: Failure
Expected: (128) <= (GetAlignment(&by_128)), actual: 128 vs 16
../../starboard/nplb/align_test.cc:120: Failure
Expected: (256) <= (GetAlignment(&by_256)), actual: 256 vs 16
[ FAILED ] SbAlignTest.AlignAsStackVariable (1 ms)
//测试代码对齐OK:
GetAlignment sizeof(size_t)=4
GetAlignment align=2
GetAlignment align=4
GetAlignment align=8
GetAlignment align=16
GetAlignment align=32
GetAlignment align=64
GetAlignment align=128
GetAlignment align=256
答案 0 :(得分:0)
我不确定你的意思“但是当我们从nplb测试文件(starboard / nplb / align_test.cc)复制测试代码时,交叉编译它并在同一个arm平台上运行它”......是你用相同的编译器标志编译?难道它只是巧合,它超出了你复制代码的环境吗? align_test.cc的代码非常简单,基本上只是确保您的SB_ALIGNAS()实现正常工作。
此外,正如您在测试中所看到的,nplb理解并非所有平台/工具链都能够进行大于16字节的堆栈变量对齐,因此在这种情况下,您应该在平台的configuration_public.h文件中定义SB_HAS_QUIRK_DOES_NOT_STACK_ALIGN_OVER_16_BYTES告知测试和Cobalt您的平台/工具链无法执行大于16个字节的堆栈对齐。