在 GASM 内联中对参数"N"的引用无效
Invalid reference to argument 'N' in GASM Inlining
我正在Solaris 11.3上使用Developer Studio 12.5附带的SunCC编译器构建Botan。我对库或Solaris不太熟悉,查找问题需要一些努力。
在一个名为divide.cpp
的相对温和的文件上,编译即将结束。我把它简化为下面的测试用例。根据Sun Studio 12编译器中对Oracle GCC风格asm内联的支持,asm的形式很好。Clang、GCC和ICC愉快地使用代码。
$ /opt/developerstudio12.5/bin/CC -m64 -std=c++11 test.cxx -c
"test.cxx", [main]:ube: error: Invalid reference to argument '1' in GASM Inlining
CC: ube failed for test.cxx
$ cat test.cxx
#include <iostream>
#include <stdint.h>
typedef uint64_t word;
inline word multadd(word a, word b, word* c)
{
asm(
"mulq %[b] nt"
"addq %[c],%[a] nt"
"adcq $0,%[carry] nt"
: [a]"=a"(a), [b]"=rm"(b), [carry]"=&d"(*c)
: "0"(a), "1"(b), [c]"g"(*c) : "cc");
return a;
}
int main(int argc, char* argv[])
{
word a, b, c, d;
std::cin >> a >> b >> c;
d = multadd(a, b, &c);
return 0;
}
我找不到有关错误字符串Invalid reference to argument 'N' in GASM Inlining
的有用信息。我在Oracle板上的内联汇编程序上发现了sunCC阻塞。但答案是UBE有问题,购买一份支持合同来了解更多信息。
我有三个问题:
错误消息指示了什么?
如何让SunCC提供源文件和行号?
我如何解决这个问题?
如果我将b
参数更改为仅=m
,则会产生相同的错误。如果我将b
参数更改为仅=r
,则会生成不同的错误:
asm(
"mulq %[b] nt"
"addq %[c],%[a] nt"
"adcq $0,%[carry] nt"
: [a]"=a"(a), [b]"=r"(b), [carry]"=&d"(*c)
: "0"(a), "1"(b), [c]"g"(*c) : "cc");
结果:
$ /opt/developerstudio12.5/bin/CC -m64 -std=c++11 test.cxx -c
Assembler: test.cxx
"<null>", line 205 : Invalid instruction argument
Near line: "mulq %rcx "
"<null>", line 206 : Invalid instruction argument
Near line: " addq %rbx,%rax "
"<null>", line 207 : Invalid instruction argument
Near line: " adcq $0,%rdx "
CC: ube failed for test.cxx
错误消息指示了什么?
很遗憾,不知道。
如果有人购买了支持合同并有时间,请向Oracle寻求答案。
如何让SunCC提供源文件和行号?
很遗憾,不知道。
如何解决此问题?
David Wohlferd怀疑[b]"=rm"(b)
输出操作数。看起来一个ASM块需要拆分为两个块。这是一个可怕的黑客攻击,但我们还没有找到另一种方法。
inline word multadd(word a, word b, word* c)
{
asm(
"mulq %[b] nt"
: [a]"+a"(a), [b]"=&d"(b)
: "0"(a), "1"(b));
asm(
"addq %[c],%[a]" nt"
"adcq $0,%[carry] nt"
: [a]"=a"(a), [carry]"=&d"(*c)
: "a"(a), "d"(b), [c]"g"(*c) : "cc");
return a;
}
相关文章:
- 从 BubbleSort* 类型的右值初始化 'AssortedSorter&' 类型的非常量引用无效"
- 为什么我总是收到此错误:从类型为"农场动物"的右值初始化类型的非常量引用无效|
- C++ 解决方法:"从类型"B*"的表达式初始化类型"C*&"的引用无效"
- 从类型 'Matrix&' 的右值初始化 类型的非 const 引用无效 'Matrix'
- 我可以在 std::list 中移动元素而不会使迭代器或引用无效,但是如何移动呢?
- 如何引用无效的输入,然后重新输入和如果其他语句
- 将 std::vector 收缩以适应对向量本身的引用无效
- C++:从类型"int*"的表达式初始化类型"const int*&"的引用无效
- 从类型为"矩阵"的右值初始化类型为"矩阵"的非常量引用无效
- 在 GASM 内联中对参数"N"的引用无效
- 从右值初始化非常量引用无效
- 错误:从类型"testGetter* const"的表达式初始化类型"const testGetter*&"的引用无效
- 尝试使用 uint*& 作为常量单元*&失败:从类型"uint8_t"的表达式初始化类型"const uint8_t*&"的引用无效
- 为什么会崩溃?对函数中静态变量的c++引用无效
- 在自定义迭代器上应用reverse_iterator后引用无效
- 错误:从类型"const int"的表达式初始化类型"int"的引用无效
- find_if错误:从类型为"node*"的表达式初始化类型"const node&"的引用无效
- 从类型 'YAML::Node&' 的右值初始化 类型的非常量引用无效 'YAML::Node'
- 从类型为"foo*"的右值初始化类型为"foo*&"的非常量引用无效?
- 取消引用无效指针但不使用结果是否是C++中的未定义行为