2011-06-01 2 views
1

Je suis en train de construire un compilateur croisé qui convertit le code c en assemblage pour ce processeur avec lequel je travaille. Après plusieurs heures de travail, j'ai réussi à compiler xgcc.exe pour que je puisse commencer à cracher des opcodes réels. Cependant, je l'ai frappé un accroc en essayant de compiler un simple code principal vide:Le compilateur croisé GCC ne peut pas passer un test void main()

void main(){} 

Quand je cours, je reçois l'erreur du compilateur interne suivant

(call_ins 3 2 5 2 (call (mem SI ("__main") [flags 0x41]) [0 S4 A8]) 

(const_int 0 [0])) test.c:1 -1 

(expr_list REG_EH_REGION (const_int 0 [0]) (nil)) (nil)) 

Internal compiler error: in extract_insn, at recog.c: 2109 

Je suis littéralement recopié une fichier descripteur de la machine à partir d'un processeur de travail similaire à la mienne (moxie), mais il produit toujours la même erreur. La ligne qui devrait collaborer avec cette erreur est la suivante:

(define_expand "call_value" 
    [(set (match_operand:SI 0 "memory_operand" "") 
     (call (match_operand:SI 1 "memory_operand" "") 
     (match_operand:SI 2 "memory_operand" "")))] 
    "" 
{ 
    gcc_assert (MEM_P (operands[1])); 
})" 

Mais je l'ai changé beaucoup de parties de celui-ci et je n'ai pas encore réussi. Des idées sur ce qui cause cette erreur?

+2

Aucun indice si cela va résoudre votre problème, mais 'main' est censé avoir un type de retour de' int', pas 'void'. S'en tenir au code standard peut être un bon début, au moins – jalf

+0

int retourne simplement un segfault non spécifique dans le compilateur. Idéalement, une fois que je n'aurai plus de travail, je pourrai trouver comment travailler, mais si ce n'est pas le cas, je n'en ai aucune idée. – RGroppa

Répondre

0

Après un tas de piratage autour, je résolus de la question avec ceci:

(define_expand "call" 
    [(call (match_operand:SI 0 "memory_operand" "") 
     (match_operand 1 "general_operand" ""))] 
    "" 
{ 
    gcc_assert (MEM_P (operands[0])); 
}) 


(define_insn "*call" 
    [(call (mem:SI (match_operand:SI 
      0 "nonmemory_operand" "i,r")) 
    (match_operand 1 "" ""))] 
    "" 
    "@ 
    call %0 
    call %0" 
) 

En un mot, il n'a pas été de trouver l'instruction d'appel parce qu'elle ne correspondait pas.

Questions connexes