Commit a4d8670ffcb1c81c386a7e1d4a60cd28221c7772

Authored by bellard
1 parent 3aba3d86

win32 fix


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3965 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 31 additions and 11 deletions
dyngen.c
@@ -1914,17 +1914,37 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, @@ -1914,17 +1914,37 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
1914 } 1914 }
1915 } 1915 }
1916 type = rel->r_type; 1916 type = rel->r_type;
1917 - switch(type) {  
1918 - case DIR32:  
1919 - fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n",  
1920 - reloc_offset, relname, addend);  
1921 - break;  
1922 - case DISP32:  
1923 - fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s - (long)(gen_code_ptr + %d) + %d -4;\n",  
1924 - reloc_offset, relname, reloc_offset, addend);  
1925 - break;  
1926 - default:  
1927 - error("unsupported i386 relocation (%d)", type); 1917 + if (is_label) {
  1918 +/* TCG uses elf relocation constants */
  1919 +#define R_386_32 1
  1920 +#define R_386_PC32 2
  1921 + switch(type) {
  1922 + case DIR32:
  1923 + type = R_386_32;
  1924 + goto do_reloc;
  1925 + case DISP32:
  1926 + type = R_386_PC32;
  1927 + addend -= 4;
  1928 + do_reloc:
  1929 + fprintf(outfile, " tcg_out_reloc(s, gen_code_ptr + %d, %d, %s, %d);\n",
  1930 + reloc_offset, type, relname, addend);
  1931 + break;
  1932 + default:
  1933 + error("unsupported i386 relocation (%d)", type);
  1934 + }
  1935 + } else {
  1936 + switch(type) {
  1937 + case DIR32:
  1938 + fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n",
  1939 + reloc_offset, relname, addend);
  1940 + break;
  1941 + case DISP32:
  1942 + fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s - (long)(gen_code_ptr + %d) + %d -4;\n",
  1943 + reloc_offset, relname, reloc_offset, addend);
  1944 + break;
  1945 + default:
  1946 + error("unsupported i386 relocation (%d)", type);
  1947 + }
1928 } 1948 }
1929 #else 1949 #else
1930 #error unsupport object format 1950 #error unsupport object format