2017-09-08 19 views
1

IBM의 XL C 컴파일러로 AIX에서 작업하고 있습니다. 컴파일 오류가 발생하여 진행 방법을 모르겠습니다.매개 변수 유형이이 연결 유형의 함수에 유효하지 않습니다.

$ xlc -g3 -O0 -qarch=pwr8 -qaltivec fips197-p8.c -o fips197-p8.exe 
"fips197-p8.c", line 59.16: 1506-754 (W) The parameter type is not valid for a function of this linkage type. 

관련 소스 코드는 아래에 나와 있습니다. 전체 소스 코드는 fips197-p8.c에서 확인할 수 있습니다. 소스 코드는 Power 8 __cipher__vcipherlast의 테스트 드라이버입니다. 그것은 메인과 몇 가지 C 기능을 가지고 있습니다. 효과적으로 Power 8 AES에 대한 최소한의 완전한 작동 예제입니다.

$ cat -n fips197-p8.c 
... 

11 #if defined(__xlc__) || defined(__xlC__) 
12 // #include <builtins.h> 
13 #include <altivec.h> 
14 typedef vector unsigned char uint8x16_p8; 
15 typedef vector unsigned int uint64x2_p8; 
16 #else 
17 #include <altivec.h> 
18 typedef vector unsigned char uint8x16_p8; 
19 typedef vector unsigned long long uint64x2_p8; 
20 #endif 
... 

52 uint8x16_p8 Load8x16(const uint8_t src[16]) 
53 { 
54 #if defined(__xlc__) || defined(__xlC__) 
55   /* IBM XL C/C++ compiler */ 
56 # if defined(__LITTLE_ENDIAN__) 
57   return vec_xl_be(0, src); 
58 # else 
59   return vec_xl(0, src); 
60 # endif 
61 #else 
62   /* GCC, Clang, etc */ 
63 
64 #endif 
65 } 

컴파일러 버전은 아래와 같습니다. 우리는 컴파일러를 제어하지 않는, 그래서 이것은 우리가 무엇을 :

$ xlc -qversion 
IBM XL C/C++ for AIX, V13.1.3 (5725-C72, 5765-J07) 
Version: 13.01.0003.0000 

vec_xl가 리틀 엔디안에 괜찮습니다. 빅 엔디안 용 vec_xl이 우리에게 문제를 일으키고 있습니다.

무엇이 문제이며 어떻게 수정합니까?

+1

AIX + IBM? 당신은 나의 동정심이 –

+0

이지만, 이것은 AIX 없이는 재현하기가 어렵습니다. IBM은 특별히 도움이되지 않습니다. –

+0

docs에서 : "함수 결과의 요소 순서는 -qaltivec = be가 적용될 때 큰 엔디안이며 그렇지 않으면 순서는 리틀 엔디안입니다." 당신은'= be'를 설정하지 않았고, 그것은 쟁점이 아닙니까? –

답변

2

약간의 추측 (작동하는 OP 주석으로 확인 됨)이 나를 이해할 수있게 만들었습니다. & "매개 변수 유형이이 연결 유형의 함수에 유효하지 않습니다." 메시지 (Google 첫 번째 경기는이 질문입니다)는 한정자 문제 일 수 있습니다.

계약이이 옵션 & 현재 엔디 언 주어진 컴파일러/프로토 타입 vec_xl_besrcconst가 아닌 매개 변수를 기대하고 있다고 믿고, 가능성이

uint8x16_p8 Load8x16(const uint8_t src[16]) 

때문에.

그래서 const가 계약을 위반 통과 (그리고 당신을 notifu 찾을 수 xlc 가장 좋은 방법입니다) 그래서

모든 발신자에 대해 일정한 제약을 삭제의 위험

uint8x16_p8 Load8x16(uint8_t src[16]) 

에 하나의 변화 ()

const을 non-const cast로 놓으십시오. (프로토 타입에 const이 없지만 실제로 데이터가 함수에서 수정되지 않은 경우처럼) :

vec_xl_be(0,(uint8_t*)src); 
+0

감사합니다. 또한 [IV91684 : VECTOR-INS VEC_CMPGE 및 VEC_CMPLE에 대한 매개 변수 유형 오류] (https://www-01.ibm.com/support/docview.wss?uid=swg1IV91684)를 발견했습니다. 나는 그게 핫픽스에 대한 것 같아요. XL C/C++ 컴파일러로 도트를 연결할만큼 충분히 작동하지 않습니다. – jww

+0

좋은 찾기. 그러나 그것은 다른 종류의 "같은 증상"이라고 생각됩니다. 그것은'gcc'가 우리를 매우 잘 대우한다는 것을 상기시켜줍니다. –

+0

이 문제를 제기 해 주셔서 감사 드리며 오해의 소지가있는 진단에 사과드립니다. 컴파일러는 const 인수를 비 const 인터페이스에 전달할 수있는 나쁜 상황을 저장하려고 시도하지만 오류 메시지가 개선 될 수 있습니다. – trudeaun