fix arm-gen.c -> gcall_or_jmp to VT_CONST

This commit is contained in:
general 2018-12-22 19:48:56 +08:00
parent 82abfd75f3
commit bf09349f8e

View file

@ -739,25 +739,28 @@ static void gadd_sp(int val)
static void gcall_or_jmp(int is_jmp) static void gcall_or_jmp(int is_jmp)
{ {
int r; int r;
if ((vtop->r & (VT_VALMASK | VT_LVAL)) == VT_CONST) {
uint32_t x; uint32_t x;
if ((vtop->r & (VT_VALMASK | VT_LVAL)) == VT_CONST) {
/* constant case */ /* constant case */
if(vtop->r & VT_SYM){
x=encbranch(ind,ind+vtop->c.i,0); x=encbranch(ind,ind+vtop->c.i,0);
if(x) { if(x) {
if (vtop->r & VT_SYM) {
/* relocation case */ /* relocation case */
greloc(cur_text_section, vtop->sym, ind, R_ARM_PC24); greloc(cur_text_section, vtop->sym, ind, R_ARM_PC24);
} else
put_elf_reloc(symtab_section, cur_text_section, ind, R_ARM_PC24, 0);
o(x|(is_jmp?0xE0000000:0xE1000000)); o(x|(is_jmp?0xE0000000:0xE1000000));
} else { } else {
if(!is_jmp) if(!is_jmp)
o(0xE28FE004); // add lr,pc,#4 o(0xE28FE004); // add lr,pc,#4
o(0xE51FF004); // ldr pc,[pc,#-4] o(0xE51FF004); // ldr pc,[pc,#-4]
if (vtop->r & VT_SYM)
greloc(cur_text_section, vtop->sym, ind, R_ARM_ABS32); greloc(cur_text_section, vtop->sym, ind, R_ARM_ABS32);
o(vtop->c.i); o(vtop->c.i);
} }
}else{
if(!is_jmp)
o(0xE28FE004); // add lr,pc,#4
o(0xE51FF004); // ldr pc,[pc,#-4]
o(vtop->c.i);
}
} else { } else {
/* otherwise, indirect call */ /* otherwise, indirect call */
r = gv(RC_INT); r = gv(RC_INT);