Index: gcc-4.2.3/gcc/config/avr32/avr32.c
===================================================================
--- gcc-4.2.3.orig/gcc/config/avr32/avr32.c	2008-05-21 13:45:59.762288215 +0200
+++ gcc-4.2.3/gcc/config/avr32/avr32.c	2008-05-21 13:46:00.342290304 +0200
@@ -695,8 +695,7 @@
 
 
     if (!avr32_const_ok_for_constraint_p (mi_delta, 'I', "Is21")
-        || vcall_offset
-        || flag_pic)
+        || vcall_offset)
       {
         fputs ("\tpushm\tlr\n", file);
       }
@@ -728,47 +727,23 @@
       }
 
 
-    if ( (!avr32_const_ok_for_constraint_p (mi_delta, 'I', "Is21")
-          || vcall_offset)
-         && !flag_pic )
+    if (!avr32_const_ok_for_constraint_p (mi_delta, 'I', "Is21")
+        || vcall_offset)
       {
         fputs ("\tpopm\tlr\n", file);
       }
-
-    if (flag_pic)
-      {
-        /* Load the got into lr and then load the pointer 
-           to the function from the got and put it on the stack.
-           We can then call the function and restore lr by issuing
-           a doubleword load from the stack. We do not use a popm/ldm
-           since it will be treated as a return and might need a flushing
-           of the return-stack if available. */
-        rtx label = gen_label_rtx ();
-        /* Load the got. */
-        fputs ("\tlddpc\tlr, 0f\n", file);
-        (*targetm.asm_out.internal_label) (file, "L",
-                                           CODE_LABEL_NUMBER (label));
-        fputs ("\trsub\tlr, pc\n", file);
-        /* Load the function pointer. */
-        fputs ("\tld.w\tlr, lr[", file);
-        assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0));
-        fputs ("@got]\n", file);
-        /* Push the function pointer on the stack.*/
-        fputs ("\tpushm\tlr\n", file);
-        /* Restore the old lr value and load the function pointer into
-           pc. */
-        fputs ("\tld.d\tlr,sp++\n", file);
-        fprintf (file, "\t.align 2\n");
-        fprintf (file, "0:\t.long\t.L%d - _GLOBAL_OFFSET_TABLE_\n", CODE_LABEL_NUMBER (label));
-      }
-    else
-      {
-        fprintf (file, "\tlddpc\tpc, 0f\n");
-        fprintf (file, "\t.align 2\n");
-        fputs ("0:\t.long\t", file);
-        assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0));
-        fputc ('\n', file);
-      }
+    
+    /* Jump to the function. We assume that we can use an rjmp since the
+       function to jump to is local and probably not too far away from
+       the thunk. If this assumption proves to be wrong we could implement
+       this jump by calculating the offset between the jump source and destination
+       and put this in the constant pool and then perform an add to pc. 
+       This would also be legitimate PIC code. But for now we hope that an rjmp
+       will be sufficient...
+    */
+    fputs ("\trjmp\t", file);
+    assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0));
+    fputc ('\n', file);
   }
 
 /* Implements target hook vector_mode_supported.  */
@@ -1742,7 +1717,7 @@
         if (TREE_CODE (*node) != FUNCTION_DECL)
           {
             warning ("`%s' attribute only applies to functions",
-                IDENTIFIER_POINTER (name));
+                     IDENTIFIER_POINTER (name));
             *no_add_attrs = true;
           }
         /* FIXME: the argument if any is checked for type attributes; should it
