[WebAssembly] Use __stack_pointer global when writing wasm binary

This ensures that symbolic relocations are generated for stack
pointer manipulations.

These relocations are of type R_WEBASSEMBLY_GLOBAL_INDEX_LEB.
This change also adds support for reading relocations of this
type in WasmObjectFile.cpp.

Since its a globally imported symbol this does mean that
the get_global/set_global instruction won't be valid until
the objects are linked that global used in no longer an
imported global.

Differential Revision: https://reviews.llvm.org/D34172

llvm-svn: 305616
diff --git a/llvm/test/CodeGen/WebAssembly/stack-alignment.ll b/llvm/test/CodeGen/WebAssembly/stack-alignment.ll
index 95aa1f9..25e9d06 100644
--- a/llvm/test/CodeGen/WebAssembly/stack-alignment.ll
+++ b/llvm/test/CodeGen/WebAssembly/stack-alignment.ll
@@ -6,7 +6,7 @@
 declare void @somefunc(i32*)
 
 ; CHECK-LABEL: underalign:
-; CHECK:      get_global $push[[L1:.+]]=, 0{{$}}
+; CHECK:      get_global $push[[L1:.+]]=, __stack_pointer{{$}}
 ; CHECK-NEXT: i32.const $push[[L2:.+]]=, 16
 ; CHECK-NEXT: i32.sub   $push[[L10:.+]]=, $pop[[L1]], $pop[[L2]]
 ; CHECK-NEXT: tee_local $push{{.+}}=, [[SP:.+]], $pop[[L10]]
@@ -17,7 +17,7 @@
 
 ; CHECK:      get_local $push[[M4:.+]]=, [[SP]]{{$}}
 ; CHECK:      i32.add   $push[[L5:.+]]=, $pop[[M4]], $pop{{.+}}
-; CHECK-NEXT: set_global 0, $pop[[L5]]
+; CHECK-NEXT: set_global __stack_pointer, $pop[[L5]]
 define void @underalign() {
 entry:
   %underaligned = alloca i32, align 8
@@ -26,7 +26,7 @@
 }
 
 ; CHECK-LABEL: overalign:
-; CHECK:      get_global $push[[L10:.+]]=, 0{{$}}
+; CHECK:      get_global $push[[L10:.+]]=, __stack_pointer{{$}}
 ; CHECK-NEXT: tee_local  $push[[L9:.+]]=, [[BP:.+]], $pop[[L10]]
 ; CHECK-NEXT: i32.const  $push[[L2:.+]]=, 32
 ; CHECK-NEXT: i32.sub    $push[[L8:.+]]=, $pop[[L9]], $pop[[L2]]
@@ -38,7 +38,7 @@
 ; CHECK:      call       somefunc@FUNCTION, $pop[[M5]]{{$}}
 
 ; CHECK:      get_local  $push[[M6:.+]]=, [[BP]]{{$}}
-; CHECK-NEXT: set_global 0, $pop[[M6]]
+; CHECK-NEXT: set_global __stack_pointer, $pop[[M6]]
 define void @overalign() {
 entry:
   %overaligned = alloca i32, align 32
@@ -47,7 +47,7 @@
 }
 
 ; CHECK-LABEL: over_and_normal_align:
-; CHECK:      get_global $push[[L14:.+]]=, 0{{$}}
+; CHECK:      get_global $push[[L14:.+]]=, __stack_pointer{{$}}
 ; CHECK-NEXT: tee_local  $push[[L13:.+]]=, [[BP:.+]], $pop[[L14]]
 ; CHECK:      i32.sub    $push[[L12:.+]]=, $pop[[L13]], $pop{{.+}}
 ; CHECK:      i32.and    $push[[L11:.+]]=, $pop[[L12]], $pop{{.+}}
@@ -61,7 +61,7 @@
 ; CHECK-NEXT: call       somefunc@FUNCTION, $pop[[L8]]
 
 ; CHECK:      get_local  $push[[L6:.+]]=, [[BP]]{{$}}
-; CHECK-NEXT: set_global 0, $pop[[L6]]
+; CHECK-NEXT: set_global __stack_pointer, $pop[[L6]]
 define void @over_and_normal_align() {
 entry:
   %over = alloca i32, align 32
@@ -72,7 +72,7 @@
 }
 
 ; CHECK-LABEL: dynamic_overalign:
-; CHECK:      get_global $push[[L18:.+]]=, 0{{$}}
+; CHECK:      get_global $push[[L18:.+]]=, __stack_pointer{{$}}
 ; CHECK-NEXT: tee_local  $push[[L17:.+]]=, [[SP:.+]], $pop[[L18]]
 ; CHECK-NEXT: set_local  [[BP:.+]], $pop[[L17]]
 ; CHECK:      tee_local  $push{{.+}}=, [[SP_2:.+]], $pop{{.+}}
@@ -81,7 +81,7 @@
 ; CHECK:      call       somefunc@FUNCTION, $pop[[M8]]
 
 ; CHECK:      get_local  $push[[M9:.+]]=, [[BP]]{{$}}
-; CHECK-NEXT: set_global 0, $pop[[M9]]
+; CHECK-NEXT: set_global __stack_pointer, $pop[[M9]]
 define void @dynamic_overalign(i32 %num) {
 entry:
   %dynamic = alloca i32, i32 %num, align 32
@@ -90,7 +90,7 @@
 }
 
 ; CHECK-LABEL: overalign_and_dynamic:
-; CHECK:      get_global $push[[L21:.+]]=, 0{{$}}
+; CHECK:      get_global $push[[L21:.+]]=, __stack_pointer{{$}}
 ; CHECK-NEXT: tee_local  $push[[L20:.+]]=, [[BP:.+]], $pop[[L21]]
 ; CHECK:      i32.sub    $push[[L19:.+]]=, $pop[[L20]], $pop{{.+}}
 ; CHECK:      i32.and    $push[[L18:.+]]=, $pop[[L19]], $pop{{.+}}
@@ -105,7 +105,7 @@
 ; CHECK-NEXT: call       somefunc@FUNCTION, $pop[[another]]
 
 ; CHECK:      get_local  $push[[M11:.+]]=, [[BP]]{{$}}
-; CHECK-NEXT: set_global 0, $pop[[M11]]
+; CHECK-NEXT: set_global __stack_pointer, $pop[[M11]]
 define void @overalign_and_dynamic(i32 %num) {
 entry:
   %over = alloca i32, align 32
@@ -116,7 +116,7 @@
 }
 
 ; CHECK-LABEL: overalign_static_and_dynamic:
-; CHECK:      get_global $push[[L26:.+]]=, 0{{$}}
+; CHECK:      get_global $push[[L26:.+]]=, __stack_pointer{{$}}
 ; CHECK-NEXT: tee_local  $push[[L25:.+]]=, [[BP:.+]], $pop[[L26]]
 ; CHECK:      i32.sub    $push[[L24:.+]]=, $pop[[L25]], $pop{{.+}}
 ; CHECK:      i32.and    $push[[L23:.+]]=, $pop[[L24]], $pop{{.+}}
@@ -136,7 +136,7 @@
 ; CHECK-NEXT: call       somefunc@FUNCTION, $pop[[static]]
 
 ; CHECK:      get_local  $push[[M14:.+]]=, [[BP]]{{$}}
-; CHECK-NEXT: set_global 0, $pop[[M14]]
+; CHECK-NEXT: set_global __stack_pointer, $pop[[M14]]
 define void @overalign_static_and_dynamic(i32 %num) {
 entry:
   %over = alloca i32, align 32