Prohibit relaxing the initial gp generation
authorPalmer Dabbelt <palmer@dabbelt.com>
Fri, 17 Mar 2017 22:39:02 +0000 (15:39 -0700)
committerAndrew Waterman <andrew@sifive.com>
Thu, 30 Mar 2017 02:47:17 +0000 (19:47 -0700)
I've added an additional linker relaxation that relaxes two instruction
pc-relative sequences to one instruction gp relative sequences when
possible.  This sequence now optimizes the initial gp generation to

  mv gp, gp

which is obviously bogus.  The fix is to disable relaxations when
setting up gp, preventing the linker from relaxing away this setup code.

benchmarks/common/crt.S
debug/programs/entry.S

index 3e6cee44a3330bcd2b616158df0f2af5434bf566..d75e81e06548df82100a010c21a6310927cadc7c 100644 (file)
@@ -111,7 +111,10 @@ _start:
   csrw mtvec, t0
 
   # initialize global pointer
+.option push
+.option norelax
   la gp, __global_pointer$
+.option pop
 
   la  tp, _end + 63
   and tp, tp, -64
index b507a934a584c99eddabcc3b1128aba34d6c16b5..e021860f58c38b85b703e6992aa6488f01e7aaed 100755 (executable)
@@ -35,7 +35,10 @@ handle_reset:
   csrwi mie, 0
 
   # initialize global pointer
+.option push
+.option norelax
   la gp, __global_pointer$
+.option pop
 
   # initialize stack pointer
   la sp, stack_top