summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2014-09-16 20:53:38 -0400
committerRuss Cox <rsc@golang.org>2014-09-16 20:53:38 -0400
commit796b5c258b412212ebf9dc8e91487eafea38a7a9 (patch)
tree3e1b50b95817de2fade607e1934fd992f17f47e8
parentbf1cf8a2e4e179e45a74f0daf3267e86cd92d659 (diff)
downloadgo-796b5c258b412212ebf9dc8e91487eafea38a7a9.tar.gz
liblink, sync/atomic: fix arm build
The liblink code to insert the FUNCDATA for a stack map from the Go prototype was not correct for ARM (different data structure layout). Also, sync/atomic was missing some Go prototypes for ARM-specific functions. TBR=r CC=golang-codereviews https://codereview.appspot.com/143160045
-rw-r--r--include/link.h1
-rw-r--r--src/liblink/obj5.c1
-rw-r--r--src/liblink/objfile.c7
-rw-r--r--src/sync/atomic/64bit_arm.go6
4 files changed, 14 insertions, 1 deletions
diff --git a/include/link.h b/include/link.h
index 8c73eab51..292b07739 100644
--- a/include/link.h
+++ b/include/link.h
@@ -471,6 +471,7 @@ struct LinkArch
int D_PARAM;
int D_SCONST;
int D_STATIC;
+ int D_OREG;
int ACALL;
int ADATA;
diff --git a/src/liblink/obj5.c b/src/liblink/obj5.c
index a571d8f16..e192b082b 100644
--- a/src/liblink/obj5.c
+++ b/src/liblink/obj5.c
@@ -1061,6 +1061,7 @@ LinkArch linkarm = {
.D_PARAM = D_PARAM,
.D_SCONST = D_SCONST,
.D_STATIC = D_STATIC,
+ .D_OREG = D_OREG,
.ACALL = ABL,
.ADATA = ADATA,
diff --git a/src/liblink/objfile.c b/src/liblink/objfile.c
index 7d4b28c9a..9b1e1b7a8 100644
--- a/src/liblink/objfile.c
+++ b/src/liblink/objfile.c
@@ -268,7 +268,12 @@ writeobj(Link *ctxt, Biobuf *b)
p->as = ctxt->arch->AFUNCDATA;
p->from.type = ctxt->arch->D_CONST;
p->from.offset = FUNCDATA_ArgsPointerMaps;
- p->to.type = ctxt->arch->D_EXTERN;
+ if(ctxt->arch->thechar == '6' || ctxt->arch->thechar == '8')
+ p->to.type = ctxt->arch->D_EXTERN;
+ else {
+ p->to.type = ctxt->arch->D_OREG;
+ p->to.name = ctxt->arch->D_EXTERN;
+ }
p->to.sym = linklookup(ctxt, smprint("%s.args_stackmap", s->name), s->version);
}
}
diff --git a/src/sync/atomic/64bit_arm.go b/src/sync/atomic/64bit_arm.go
index c08f214c7..0aab7160e 100644
--- a/src/sync/atomic/64bit_arm.go
+++ b/src/sync/atomic/64bit_arm.go
@@ -44,3 +44,9 @@ func swapUint64(addr *uint64, new uint64) (old uint64) {
}
return
}
+
+// Additional ARM-specific assembly routines.
+// Declaration here to give assembly routines correct stack maps for arguments.
+func armCompareAndSwapUint32(addr *uint32, old, new uint32) (swapped bool)
+func armCompareAndSwapUint64(addr *uint64, old, new uint64) (swapped bool)
+func generalCAS64(addr *uint64, old, new uint64) (swapped bool)