aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/5l/obj.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/5l/obj.c')
-rw-r--r--src/cmd/5l/obj.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/cmd/5l/obj.c b/src/cmd/5l/obj.c
index 24e6294a84..47831e39c6 100644
--- a/src/cmd/5l/obj.c
+++ b/src/cmd/5l/obj.c
@@ -627,6 +627,38 @@ loop:
pc++;
goto loop;
+ case ANPTRS:
+ if(skip)
+ goto casedef;
+ if(cursym->nptrs != -1) {
+ diag("ldobj1: multiple pointer maps defined for %s", cursym->name);
+ errorexit();
+ }
+ if(p->to.offset > cursym->args/PtrSize) {
+ diag("ldobj1: pointer map definition for %s exceeds its argument size", cursym->name);
+ errorexit();
+ }
+ cursym->nptrs = p->to.offset;
+ if(cursym->nptrs != 0)
+ cursym->ptrs = mal((rnd(cursym->nptrs, 32) / 32) * sizeof(*cursym->ptrs));
+ pc++;
+ goto loop;
+
+ case APTRS:
+ if(skip)
+ goto casedef;
+ if(cursym->nptrs == -1 || cursym->ptrs == NULL) {
+ diag("ldobj1: pointer map data provided for %s without a definition", cursym->name);
+ errorexit();
+ }
+ if(p->from.offset*32 >= rnd(cursym->nptrs, 32)) {
+ diag("ldobj1: excessive pointer map data provided for %s", cursym->name);
+ errorexit();
+ }
+ cursym->ptrs[p->from.offset] = p->to.offset;
+ pc++;
+ goto loop;
+
case ATEXT:
if(cursym != nil && cursym->text) {
histtoauto();
@@ -670,6 +702,7 @@ loop:
s->text = p;
s->value = pc;
s->args = p->to.offset2;
+ s->nptrs = -1;
lastp = p;
p->pc = pc;
pc++;