summaryrefslogtreecommitdiff
path: root/src/cmd/5g/opt.h
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2013-08-12 13:42:23 -0400
committerRuss Cox <rsc@golang.org>2013-08-12 13:42:23 -0400
commit8fd16e56b894df465d68f9c97da6611d1c0b226c (patch)
tree2df6e8440048bc22322c6bd4694bd30db3f9790d /src/cmd/5g/opt.h
parent61b8c0619148b2e887c34ee6ece928c3d9ac6cfa (diff)
downloadgo-8fd16e56b894df465d68f9c97da6611d1c0b226c.tar.gz
cmd/5g: factor out prog information
Like CL 12637051, but for 5g instead of 6g. R=ken2 CC=golang-dev https://codereview.appspot.com/12779043
Diffstat (limited to 'src/cmd/5g/opt.h')
-rw-r--r--src/cmd/5g/opt.h52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/cmd/5g/opt.h b/src/cmd/5g/opt.h
index af7d654de..84c81c849 100644
--- a/src/cmd/5g/opt.h
+++ b/src/cmd/5g/opt.h
@@ -165,3 +165,55 @@ int32 RtoB(int);
int32 FtoB(int);
int BtoR(int32);
int BtoF(int32);
+
+/*
+ * prog.c
+ */
+typedef struct ProgInfo ProgInfo;
+struct ProgInfo
+{
+ uint32 flags; // the bits below
+};
+
+enum
+{
+ // Pseudo-op, like TEXT, GLOBL, TYPE, PCDATA, FUNCDATA.
+ Pseudo = 1<<1,
+
+ // There's nothing to say about the instruction,
+ // but it's still okay to see.
+ OK = 1<<2,
+
+ // Size of right-side write, or right-side read if no write.
+ SizeB = 1<<3,
+ SizeW = 1<<4,
+ SizeL = 1<<5,
+ SizeQ = 1<<6,
+ SizeF = 1<<7, // float aka float32
+ SizeD = 1<<8, // double aka float64
+
+ // Left side: address taken, read, write.
+ LeftAddr = 1<<9,
+ LeftRead = 1<<10,
+ LeftWrite = 1<<11,
+
+ // Register in middle; never written.
+ RegRead = 1<<12,
+ CanRegRead = 1<<13,
+
+ // Right side: address taken, read, write.
+ RightAddr = 1<<14,
+ RightRead = 1<<15,
+ RightWrite = 1<<16,
+
+ // Instruction kinds
+ Move = 1<<17, // straight move
+ Conv = 1<<18, // size conversion
+ Cjmp = 1<<19, // conditional jump
+ Break = 1<<20, // breaks control flow (no fallthrough)
+ Call = 1<<21, // function call
+ Jump = 1<<22, // jump
+ Skip = 1<<23, // data instruction
+};
+
+void proginfo(ProgInfo*, Prog*);