2014-02-07 7 views
1

첫 번째로, 저는 이것에 대해 매우 새로운 것입니다. Sparc 프로세서가있는 Solaris 10에서 Sun Studio 12.3을 컴파일러로 사용하여 T1 아키텍처 및 시뮬레이션 모델링 도구 (http://www.oracle.com/technetwork/systems/opensparc/opensparc-t1-page-1444609.html)를 컴파일하려고합니다.T1 아키텍처 및 시뮬레이션 모델링 도구를 컴파일 할 수 없습니다.

"build_sas.sh"스크립트를 실행 중이고 컴파일 오류가 발생합니다.

--- Building n1 in fw --- 
/opt/solarisstudio12.3/bin/CC -G -KPIC -fast -xO5 -DNDEBUG -DRS_INLINE=inline  -DRS_MPSAS_COMPATIBLE -xarch=v9a -DHOST64BIT=1 -DN1_BOOTS10 -DMEMORY_SPARSE -I../../include/fw -I../../include/mmu -I../../include/strand -I../../include/core -I../../include/cpu -I../../include/asi -I../../include/system -I../../include/trap -I/scratch/sam-t1/devtools/64/include/python2.4 -c -o obj64opt_n1/Interface/XmlTokenizer.o Interface/XmlTokenizer.cc 
CC: Warning: -xarch=v9a is deprecated, use -m64 -xarch=sparcvis instead 
"Interface/XmlTokenizer.cc", line 157: Error: Formal argument value of type std::string & in call to Riesling::XmlTokenizer::CallBack::notify(std::string &) requires an lvalue. 
"Interface/XmlTokenizer.cc", line 162: Error: Formal argument value of type std::string & in call to Riesling::XmlTokenizer::CallBack::notify(std::string &) requires an lvalue. 
"Interface/XmlTokenizer.cc", line 167: Error: Formal argument value of type std::string & in call to Riesling::XmlTokenizer::CallBack::notify(std::string &) requires an lvalue. 
3 Error(s) detected. 
*** Error code 2 
make: Fatal error: Command failed for target `obj64opt_n1/Interface/XmlTokenizer.o' 
Current working directory /scratch/sam-t1/src/riesling-cm/riesling/src/fw 
*** Error code 1 
make: Fatal error: Command failed for target `fw' 

소스 코드의 오류가 확실하지 않습니다. 다음은 소스 코드입니다.

#include "Interface/XmlTokenizer.h" 
#include "StdMacros.h" 
#include <sstream> 

using namespace std; 
using namespace Riesling; 
XmlTokenizer::XmlTokenizer() : 
    startTagHandler_(NULL), 
    endTagHandler_(NULL), 
    dataHandler_(NULL) 
{} 

XmlTokenizer::XmlTokenizer(string &xmlString, 
     CallBack *start, 
     CallBack *end, 
     CallBack *data ) : 
    startTagHandler_(start), 
    endTagHandler_(end), 
    dataHandler_(data) 
{ 
    tokenize(xmlString); 
} 

XmlTokenizer::XmlTokenizer(const XmlTokenizer & orig) : 
    startTagHandler_(orig.startTagHandler_), 
    endTagHandler_(orig.endTagHandler_), 
    dataHandler_(orig.dataHandler_) 
{} 

XmlTokenizer::~XmlTokenizer() 
{} 

const XmlTokenizer & 
XmlTokenizer::operator=(const XmlTokenizer & rhs) 
{ 
    startTagHandler_ = rhs.startTagHandler_; 
    endTagHandler_ = rhs.endTagHandler_; 
    dataHandler_ = rhs.dataHandler_; 
    return *this; 
} 

bool 
XmlTokenizer::operator==(const XmlTokenizer & rhs) const 
{ 
    return endTagHandler_ == rhs.endTagHandler_ && 
      startTagHandler_ == rhs.startTagHandler_ && 
      dataHandler_ == rhs.dataHandler_; 
} 

string 
XmlTokenizer::toString() const 
{ 
    ostringstream os; 
    return os.str(); 
} 

int 
XmlTokenizer::nextToken(string::iterator &start, 
     string::iterator &end, 
     const string::iterator &endOfString) 
{ 
    int result = -1; 

    start = end; 
    while(start != endOfString && *start != '<' && *start != '>'){ 
     ++start; 
     if(*start == '\\' && start != endOfString){ 
      ++start; 
     } 
    } 

    if(start == endOfString){ 
     return END_OF_STRING; 
    } 

    end = start; 
    ++end; 

    while(end != endOfString && *end != '<' && *end != '>'){ 
     ++end; 
     if(*end == '\\' && end != endOfString){ 
      ++end; 
     } 
    } 

    if(end == endOfString){ 
     return END_OF_STRING; 
    } 

    if(*start == '<' && *end == '>'){ 
     string::iterator i = start; 
     while(i != end && *i != '/'){ 
      ++i; 
     } 
     if(i == end){ 
      result = START_TAG; 
     } else { 
      result = END_TAG; 
     } 
    } else if(*start == '>' && *end == '<') { 
     ++start; 
     result = DATA; 
    } else { 
     string msg("Invalid XML \""); 
     msg.append(string(start, end)).append("\""); 
     RIESLING_THROW_DOMAIN_ERROR(msg); 
    } 

    return result; 
} 


void 
XmlTokenizer::tokenize(string &xmlSt) 
{ 
    int currToken; 
    string::iterator start = xmlSt.begin(); 
    string::iterator end = xmlSt.begin(); 

    while((currToken = nextToken(start, end, xmlSt.end())) != END_OF_STRING) { 
     switch(currToken){ 
      case START_TAG: 
       if(startTagHandler_){ 
        startTagHandler_->notify(string(start + 1, end)); 
       } 
       break; 
      case END_TAG: 
       if(endTagHandler_){ 
        endTagHandler_->notify(string(start + 2, end)); 
       } 
       break; 
      case DATA: 
       if(dataHandler_){ 
        dataHandler_->notify(string(start, end)); 
       } 
       break; 
      default: 
       RIESLING_THROW_DOMAIN_ERROR("An unknown error occured"); 
     } 
    } 
} 

void 
XmlTokenizer::setStartTagHandler(CallBack *startTagHandler) 
{ 
    startTagHandler_ = startTagHandler; 
} 

void 
XmlTokenizer::setEndTagHandler(CallBack *endTagHandler) 
{ 
    endTagHandler_ = endTagHandler; 
} 

void 
XmlTokenizer::setDataHandler(CallBack *dataHandler) 
{ 
    dataHandler_ = dataHandler; 
} 

정말로 도움/제안을 부탁드립니다.

감사합니다.

답변

0

컴파일러 옵션 -features=rvalueref을 사용해보십시오. 소프트웨어와 함께 제공되는 빌드 지침이 있습니까?

0

T1에 포함되지 않은 -xarch=sparcvis으로 SPARC VIS 확장 명령어를 강제 설정해야합니다. VIS 및 VIS +는 UltraSPARC III + IV + 전용입니다. CPU 지원 여부를 확인하려면 isainfo -bv을 실행하십시오. 상호 컴파일하지 않을 때는 -xarch=native을 사용하십시오.

+0

">은 isainfo -bv : 64 비트 SPARCV9 응용 프로그램 : vis2 마주" 이 그래서, 그것은 sparcvis을 지원하거나 내가 먼저 가서 어쨌든 네이티브 -xarch =를 사용한다는 의미는 무엇입니까? 감사합니다. – user3285014

+0

'vis2 vis'가 있으면 T1이 아니며'sparcvis '를 지원합니다. '-xarch = native'는 프로세서에 가장 적합한 코드를 만들지 만, 당신이 원하는 것을 정확히 말할 수 있습니다. 'vis2'가있는 한, 32 비트 바이너리에는'-xarch = sparcvis2'를, 64 비트에는'-xarch = v9b'를 사용할 수 있습니다. – nudzo