2016-09-12 2 views
0

필자는 16 비트 PIC 마이크로 컨트롤러 (PIC24, dsPIC30/33) 용 LLVM 백엔드를 작성하기 시작했습니다. 그 소리 알려져 백엔드을 복사하고 라나이에서 물건의 이름을 변경, 많이 제거, 몇 가지를 추가하고 한 후에 나는 내가 원하는 정확하게 무엇을하는PIC 백엔드 : 16 비트 레지스터/리턴 타입

short foo(void) { return 6*7; } 

mov #0x2A, W0 
ret 

를 번역 할 수 있습니다. "EP : 16 : 16 I16 : 16-A : 0 : 16 N16-S16 EM"및 레지스터

def GPR : RegisterClass<"PIC", [i16], 16, (sequence "W%u", 0, 15)>; 

정의 및 첨가 등

DataLayout가 설정되어

나는 'INT'에 위의 반환 형식을 변경할 때

addRegisterClass(MVT::i16, &PIC::GPRRegClass); 

는 그러나, 나는 I16는 유형을 현재 취급 때문에 이상하다 "반환 피연산자 # 1 형 I16을 처리되지 않은있다"얻을 :

,363,210
def RetCC_PIC16 : CallingConv<[ 
    // Use W0 to return 16-bit value. 
    CCIfType<[i16], CCAssignToReg<[W0]>> 
]>; 

컴파일 내가 놓친 게 무엇

CCInfo.AnalyzeReturn(Outs, RetCC_PIC16); 

에서 LowerReturn()에 중단? clang/llvm에게 int 크기와 사용 방법을 알려주려면 어떻게해야합니까?

식별자 GPRRegClass는 어디서 왔으며 실제로 맞습니까?

답변