/[qemu]/qemu/dyngen.c
ViewVC logotype

Diff of /qemu/dyngen.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.36 by bellard, Mon Jan 3 23:40:55 2005 UTC revision 1.37 by bellard, Sun Jan 23 20:42:06 2005 UTC
# Line 1185  int load_object(const char *filename) Line 1185  int load_object(const char *filename)
1185    
1186  #endif /* CONFIG_FORMAT_MACH */  #endif /* CONFIG_FORMAT_MACH */
1187    
1188    void get_reloc_expr(char *name, int name_size, const char *sym_name)
1189    {
1190        const char *p;
1191    
1192        if (strstart(sym_name, "__op_param", &p)) {
1193            snprintf(name, name_size, "param%s", p);
1194        } else if (strstart(sym_name, "__op_gen_label", &p)) {
1195            snprintf(name, name_size, "gen_labels[param%s]", p);
1196        } else {
1197    #ifdef HOST_SPARC
1198            if (sym_name[0] == '.')
1199                snprintf(name, sizeof(name),
1200                         "(long)(&__dot_%s)",
1201                         sym_name + 1);
1202            else
1203    #endif
1204                snprintf(name, name_size, "(long)(&%s)", sym_name);
1205        }
1206    }
1207    
1208  #ifdef HOST_ARM  #ifdef HOST_ARM
1209    
1210  int arm_emit_ldr_info(const char *name, unsigned long start_offset,  int arm_emit_ldr_info(const char *name, unsigned long start_offset,
# Line 1244  int arm_emit_ldr_info(const char *name, Line 1264  int arm_emit_ldr_info(const char *name,
1264                          if (rel->r_offset == (pc_offset + start_offset)) {                          if (rel->r_offset == (pc_offset + start_offset)) {
1265                              sym_name = get_rel_sym_name(rel);                              sym_name = get_rel_sym_name(rel);
1266                              /* the compiler leave some unnecessary references to the code */                              /* the compiler leave some unnecessary references to the code */
1267                              if (strstart(sym_name, "__op_param", &p)) {                              get_reloc_expr(relname, sizeof(relname), sym_name);
                                 snprintf(relname, sizeof(relname), "param%s", p);  
                             } else {  
                                 snprintf(relname, sizeof(relname), "(long)(&%s)", sym_name);  
                             }  
1268                              type = ELF32_R_TYPE(rel->r_info);                              type = ELF32_R_TYPE(rel->r_info);
1269                              if (type != R_ARM_ABS32)                              if (type != R_ARM_ABS32)
1270                                  error("%s: unsupported data relocation", name);                                  error("%s: unsupported data relocation", name);
# Line 1641  void gen_code(const char *name, host_ulo Line 1657  void gen_code(const char *name, host_ulo
1657                          continue;                          continue;
1658                      }                      }
1659                                                    
1660                      if (strstart(sym_name, "__op_param", &p)) {                      get_reloc_expr(name, sizeof(name), sym_name);
                         snprintf(name, sizeof(name), "param%s", p);  
                     } else if (strstart(sym_name, "__op_gen_label", &p)) {  
                         snprintf(name, sizeof(name), "gen_labels[param%s]", p);  
                     } else {  
                         snprintf(name, sizeof(name), "(long)(&%s)", sym_name);  
                     }  
1661                      addend = get32((uint32_t *)(text + rel->r_offset));                      addend = get32((uint32_t *)(text + rel->r_offset));
1662  #ifdef CONFIG_FORMAT_ELF  #ifdef CONFIG_FORMAT_ELF
1663                      type = ELF32_R_TYPE(rel->r_info);                      type = ELF32_R_TYPE(rel->r_info);
# Line 1705  void gen_code(const char *name, host_ulo Line 1715  void gen_code(const char *name, host_ulo
1715                  if (rel->r_offset >= start_offset &&                  if (rel->r_offset >= start_offset &&
1716                      rel->r_offset < start_offset + copy_size) {                      rel->r_offset < start_offset + copy_size) {
1717                      sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name;                      sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name;
1718                      if (strstart(sym_name, "__op_param", &p)) {                      get_reloc_expr(name, sizeof(name), sym_name);
                         snprintf(name, sizeof(name), "param%s", p);  
                     } else {  
                         snprintf(name, sizeof(name), "(long)(&%s)", sym_name);  
                     }  
1719                      type = ELF32_R_TYPE(rel->r_info);                      type = ELF32_R_TYPE(rel->r_info);
1720                      addend = rel->r_addend;                      addend = rel->r_addend;
1721                      switch(type) {                      switch(type) {
# Line 1753  void gen_code(const char *name, host_ulo Line 1759  void gen_code(const char *name, host_ulo
1759                              continue;                              continue;
1760                          }                          }
1761                                                    
1762                          if (strstart(sym_name, "__op_param", &p)) {                          get_reloc_expr(name, sizeof(name), sym_name);
                             snprintf(name, sizeof(name), "param%s", p);  
                         } else {  
                             snprintf(name, sizeof(name), "(long)(&%s)", sym_name);  
                         }  
1763                          type = ELF32_R_TYPE(rel->r_info);                          type = ELF32_R_TYPE(rel->r_info);
1764                          addend = rel->r_addend;                          addend = rel->r_addend;
1765                          switch(type) {                          switch(type) {
# Line 1842  void gen_code(const char *name, host_ulo Line 1844  void gen_code(const char *name, host_ulo
1844                                                  continue; /* dunno how to handle without final_sym_name */                                                  continue; /* dunno how to handle without final_sym_name */
1845                                          }                                          }
1846                                                                                                                                                                                                                        
1847                                          if (strstart(sym_name, "__op_param", &p)) {                                          get_reloc_expr(final_sym_name, sizeof(final_sym_name),
1848                                                  snprintf(final_sym_name, sizeof(final_sym_name), "param%s", p);                                                         sym_name);
                                         } else {  
                                                 snprintf(final_sym_name, sizeof(final_sym_name), "(long)(&%s)", sym_name);  
                                         }  
                           
1849                                          switch(type) {                                          switch(type) {
1850                                          case PPC_RELOC_BR24:                                          case PPC_RELOC_BR24:
1851                                                  fprintf(outfile, "{\n");                                                  fprintf(outfile, "{\n");
# Line 1885  void gen_code(const char *name, host_ulo Line 1883  void gen_code(const char *name, host_ulo
1883                      if (rel->r_offset >= start_offset &&                      if (rel->r_offset >= start_offset &&
1884                          rel->r_offset < start_offset + copy_size) {                          rel->r_offset < start_offset + copy_size) {
1885                          sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name;                          sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name;
1886                          if (strstart(sym_name, "__op_param", &p)) {                          get_reloc_expr(name, sizeof(name), sym_name);
                             snprintf(name, sizeof(name), "param%s", p);  
                         } else {  
                             snprintf(name, sizeof(name), "(long)(&%s)", sym_name);  
                         }  
1887                          type = ELF32_R_TYPE(rel->r_info);                          type = ELF32_R_TYPE(rel->r_info);
1888                          addend = rel->r_addend;                          addend = rel->r_addend;
1889                          switch(type) {                          switch(type) {
# Line 1973  void gen_code(const char *name, host_ulo Line 1967  void gen_code(const char *name, host_ulo
1967                  for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {                  for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
1968                      if (rel->r_offset >= start_offset && rel->r_offset < start_offset + copy_size) {                      if (rel->r_offset >= start_offset && rel->r_offset < start_offset + copy_size) {
1969                          sym_name = strtab + symtab[ELF64_R_SYM(rel->r_info)].st_name;                          sym_name = strtab + symtab[ELF64_R_SYM(rel->r_info)].st_name;
1970                          if (strstart(sym_name, "__op_param", &p)) {                          get_reloc_expr(name, sizeof(name), sym_name);
                             snprintf(name, sizeof(name), "param%s", p);  
                         } else {  
                             snprintf(name, sizeof(name), "(long)(&%s)", sym_name);  
                         }  
1971                          type = ELF64_R_TYPE(rel->r_info);                          type = ELF64_R_TYPE(rel->r_info);
1972                          addend = rel->r_addend;                          addend = rel->r_addend;
1973                          switch(type) {                          switch(type) {
# Line 2000  void gen_code(const char *name, host_ulo Line 1990  void gen_code(const char *name, host_ulo
1990                      if (rel->r_offset >= start_offset &&                      if (rel->r_offset >= start_offset &&
1991                          rel->r_offset < start_offset + copy_size) {                          rel->r_offset < start_offset + copy_size) {
1992                          sym_name = strtab + symtab[ELF32_R_SYM(rel->r_info)].st_name;                          sym_name = strtab + symtab[ELF32_R_SYM(rel->r_info)].st_name;
1993                          if (strstart(sym_name, "__op_param", &p)) {                          get_reloc_expr(name, sizeof(name), sym_name);
                             snprintf(name, sizeof(name), "param%s", p);  
                         } else {  
                                 if (sym_name[0] == '.')  
                                         snprintf(name, sizeof(name),  
                                                  "(long)(&__dot_%s)",  
                                                  sym_name + 1);  
                                 else  
                                         snprintf(name, sizeof(name),  
                                                  "(long)(&%s)", sym_name);  
                         }  
1994                          type = ELF32_R_TYPE(rel->r_info);                          type = ELF32_R_TYPE(rel->r_info);
1995                          addend = rel->r_addend;                          addend = rel->r_addend;
1996                          switch(type) {                          switch(type) {
# Line 2065  void gen_code(const char *name, host_ulo Line 2045  void gen_code(const char *name, host_ulo
2045                      if (rel->r_offset >= start_offset &&                      if (rel->r_offset >= start_offset &&
2046                          rel->r_offset < start_offset + copy_size) {                          rel->r_offset < start_offset + copy_size) {
2047                          sym_name = strtab + symtab[ELF64_R_SYM(rel->r_info)].st_name;                          sym_name = strtab + symtab[ELF64_R_SYM(rel->r_info)].st_name;
2048                          if (strstart(sym_name, "__op_param", &p)) {                          get_reloc_expr(name, sizeof(name), sym_name);
                             snprintf(name, sizeof(name), "param%s", p);  
                         } else {  
                             snprintf(name, sizeof(name), "(long)(&%s)", sym_name);  
                         }  
2049                          type = ELF64_R_TYPE(rel->r_info);                          type = ELF64_R_TYPE(rel->r_info);
2050                          addend = rel->r_addend;                          addend = rel->r_addend;
2051                          switch(type) {                          switch(type) {
# Line 2131  void gen_code(const char *name, host_ulo Line 2107  void gen_code(const char *name, host_ulo
2107                      /* the compiler leave some unnecessary references to the code */                      /* the compiler leave some unnecessary references to the code */
2108                      if (sym_name[0] == '\0')                      if (sym_name[0] == '\0')
2109                          continue;                          continue;
2110                      if (strstart(sym_name, "__op_param", &p)) {                      get_reloc_expr(name, sizeof(name), sym_name);
                         snprintf(name, sizeof(name), "param%s", p);  
                     } else {  
                         snprintf(name, sizeof(name), "(long)(&%s)", sym_name);  
                     }  
2111                      type = ELF32_R_TYPE(rel->r_info);                      type = ELF32_R_TYPE(rel->r_info);
2112                      addend = get32((uint32_t *)(text + rel->r_offset));                      addend = get32((uint32_t *)(text + rel->r_offset));
2113                      switch(type) {                      switch(type) {
# Line 2164  void gen_code(const char *name, host_ulo Line 2136  void gen_code(const char *name, host_ulo
2136                      rel->r_offset < start_offset + copy_size) {                      rel->r_offset < start_offset + copy_size) {
2137                      sym = &(symtab[ELFW(R_SYM)(rel->r_info)]);                      sym = &(symtab[ELFW(R_SYM)(rel->r_info)]);
2138                      sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name;                      sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name;
2139                      if (strstart(sym_name, "__op_param", &p)) {                      get_reloc_expr(name, sizeof(name), sym_name);
                         snprintf(name, sizeof(name), "param%s", p);  
                     } else {  
                         snprintf(name, sizeof(name), "(long)(&%s)", sym_name);  
                     }  
2140                      type = ELF32_R_TYPE(rel->r_info);                      type = ELF32_R_TYPE(rel->r_info);
2141                      addend = get32((uint32_t *)(text + rel->r_offset)) + rel->r_addend;                      addend = get32((uint32_t *)(text + rel->r_offset)) + rel->r_addend;
2142                      switch(type) {                      switch(type) {

Legend:
Removed from v.1.36  
changed lines
  Added in v.1.37

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26