2017-01-25 5 views
1

Developer Studio 12.5와 함께 제공되는 SunCC 컴파일러를 사용하여 Solaris 11.3에 Botan을 구축하고 있습니다. 나는 도서관이나 솔라리스에 익숙하지 않고 문제를 추적하는 데 약간의 노력이 필요합니다.GASM 인라이닝의 인수 'N'에 대한 잘못된 참조

컴파일은 비교적 양호한 파일 divide.cpp으로 죽어 가고 있습니다. 다음 테스트 케이스로 축소했습니다. 오라클의 GCC-style asm inlining support in Sun Studio 12 compilers에 따르면 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]   \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 chokes on inline assembler을 찾았습니다. 그러나 UBE는 버그가 있으며 더 많은 것을 배우기 위해 지원 계약을 맺습니다.

  • 오류 메시지가 무엇을 나타내는 않습니다

    나는 세 가지 질문이 있습니까?

  • 어떻게 SunCC에서 소스 파일과 줄 번호를 제공합니까?

  • 어떻게하면 문제를 해결할 수 있습니까? I는 b 파라미터를 변경하는 경우


단지 =m 다음과 같은 오류가 발생되어있다. 나는 b 매개 변수를 변경하면 바로 =r 후 다른 오류가 생성되는 :

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"); 

그리고 결과 : 오류 메시지가 무엇

$ /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 
+0

gcc이면'-S'를 사용하여 건물을 제안하고 싶습니다. Suncc도이 문제를 지원할 것입니까? (https://docs.oracle.com/cd/E19205-01/819-5265/6n7c29df6/index.html#6n7c29dmc) 정확히 무엇이 생성되는지를 확인하면 실제로 도움이 될 것입니다. 또한'mull'과'addl'을 사용하는 것에 대해 궁금합니다. 그 마지막'l'은 4byte int를 가리 키기로되어 있지만, 당신은 (2 바이트라고 가정하는) 단어들을 전달하고 있습니까? 그리고 당신이 제공 한 블로그 링크는 Sun의 C++이 '즉각적인'피연산자를 잘 처리하지 못한다고 말합니다. 'g'는'i'를 의미 할 수 있습니다. 그것이 "인수 1"인 방법을 보지 마라. –

+0

작은 케이스가 도움이됩니다. 너는 그것을 더 작게 만들 수 있니? asm 문자열에''''을 사용하면 어떨까요? 제 추측으로는 적어도 여러분이 적어도'mull % [b]'가 필요하다는 것이 드러날 것입니다. –

+0

컴파일하는 동안 문제가 발생하기 때문에 실제로 블록을 작동하거나 동일한 결과를 생성 할 필요가 없습니다. 필요한 asm을 최소한으로 줄인 후에도 여전히 오류가 발생하면 인수를 삭제할 수 있습니다. 나는 기대하고있다. 'asm ("mull % [b]": [b] "rm"(b) : "0"(b)); –

답변

1

을 가리키다?

불행히도, 모릅니다.

누군가가 지원 계약을 맺고 시간을 보낸다면 오라클에 답변을 요청하십시오.

어떻게 SunCC에서 소스 파일과 줄 번호를 제공합니까?

불행히도, 모릅니다.

어떻게하면 문제를 해결할 수 있습니까?

David Wohlferd는 [b]"=rm"(b) 출력 피연산자를 의심했습니다.하나의 ASM 블록을 두 개의 블록으로 분할해야하는 것처럼 보입니다. 그것의 끔찍한 해킹,하지만 우리는 그것을 할 다른 방법을 찾지 못했습니다.

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; 
}