首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >气垫衬里参数'N‘的无效引用

气垫衬里参数'N‘的无效引用
EN

Stack Overflow用户
提问于 2017-01-25 13:13:26
回答 1查看 67关注 0票数 1

我正在Solaris 11.3上使用DeveloperStudio12.5附带的博坦编译器构建SunCC。我不太熟悉这个库或Solaris,我需要一些努力才能找到问题。

在一个相对良性的名为divide.cpp的文件上,编译即将结束。我把它简化为下面的测试用例。根据甲骨文的Sun Studio 12编译器中GCC风格的asm内联支持,ASM的格式很好。Clang,GCC和ICC愉快地使用了代码。

代码语言:javascript
运行
复制
$ /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]          \n\t"
        "addq %[c],%[a]     \n\t"
        "adcq $0,%[carry]   \n\t" 

      : [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.的有用信息我在甲骨文板上找到了内联汇编程序上的sunCC卡。但答案是,UBE是错误的,并购买了一个支持合同,以了解更多。

我有三个问题:

  • 错误信息指出了什么?
  • 如何让SunCC提供源文件和行号?
  • 我该如何解决这个问题?

如果我将b参数更改为=m,,则会产生相同的错误。如果我将b参数更改为=r,,则会生成不同的错误:

代码语言:javascript
运行
复制
asm(
    "mulq %[b]          \n\t"
    "addq %[c],%[a]     \n\t"
    "adcq $0,%[carry]   \n\t"

    : [a]"=a"(a), [b]"=r"(b), [carry]"=&d"(*c)
    : "0"(a), "1"(b), [c]"g"(*c) : "cc");

其结果是:

代码语言:javascript
运行
复制
$ /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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-26 04:45:55

错误信息指出了什么?

不幸的是,不知道。

如果有人购买了一个支持合同,并有时间,那么请征求甲骨文的答复。

如何让SunCC提供源文件和行号?

不幸的是,不知道。

我该如何解决这个问题?

David怀疑[b]"=rm"(b)输出操作数。看起来,一个ASM块需要分成两个块。这是一次可怕的攻击,但我们还没有想出另一种办法。

代码语言:javascript
运行
复制
inline word multadd(word a, word b, word* c)
{
    asm(
      "mulq %[b]            \n\t"

      : [a]"+a"(a), [b]"=&d"(b)
      : "0"(a), "1"(b));
    asm(
      "addq %[c],%[a]"      \n\t"
      "adcq $0,%[carry]     \n\t"

      : [a]"=a"(a), [carry]"=&d"(*c)
      : "a"(a), "d"(b), [c]"g"(*c) : "cc");

    return a;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41852552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档