summaryrefslogtreecommitdiff
path: root/source/slang/ir.h
diff options
context:
space:
mode:
authorTim Foley <tfoley@nvidia.com>2017-08-17 14:51:09 -0700
committerTim Foley <tfoley@nvidia.com>2017-08-17 14:51:09 -0700
commitec8175c1f0afe3f7758f70da240aba03a791c3a9 (patch)
tree53a6a509f3bba87d964ba3a5007b538db1d83a4e /source/slang/ir.h
parent95348fdb623509eb22c04d4c7c19af8228c5a533 (diff)
[ir] Add support for "decorations" on instructions
The terminology here is similar to SPIR-V. For right now the only decoration exposed is a fairly brute-force one that just points back to a high-level declaration so that we can look up info on it that might affect how we print output.
Diffstat (limited to 'source/slang/ir.h')
-rw-r--r--source/slang/ir.h55
1 files changed, 55 insertions, 0 deletions
diff --git a/source/slang/ir.h b/source/slang/ir.h
index 319340024..fcebf5d15 100644
--- a/source/slang/ir.h
+++ b/source/slang/ir.h
@@ -69,6 +69,22 @@ struct IRUse
void init(IRInst* user, IRInst* usedValue);
};
+enum IRDecorationOp : uint16_t
+{
+ kIRDecorationOp_HighLevelDecl,
+};
+
+// A "decoration" that gets applied to an instruction.
+// These usually don't affect semantics, but are useful
+// for preserving high-level source information.
+struct IRDecoration
+{
+ // Next decoration attached to the same instruction
+ IRDecoration* next;
+
+ IRDecorationOp op;
+};
+
typedef uint32_t IRInstID;
// In the IR, almost *everything* is an instruction,
@@ -99,6 +115,18 @@ struct IRInst
// The first use of this value (start of a linked list)
IRUse* firstUse;
+ // The linked list of decorations attached to this instruction
+ IRDecoration* firstDecoration;
+
+ IRDecoration* findDecorationImpl(IRDecorationOp op);
+
+ template<typename T>
+ T* findDecoration()
+ {
+ return (T*) findDecorationImpl(IRDecorationOp(T::kDecorationOp));
+ }
+
+
// The type of this value
IRUse type;
@@ -117,8 +145,22 @@ struct IRInst
}
};
+// This type alias exists because I waffled on the name for a bit.
+// All existing uses of `IRValue` should move to `IRInst`
typedef IRInst IRValue;
+class Decl;
+
+// Associates an IR-level decoration with a source declaration
+// in the high-level AST, that can be used to extract
+// additional information that informs code emission.
+struct IRHighLevelDeclDecoration : IRDecoration
+{
+ enum { kDecorationOp = kIRDecorationOp_HighLevelDecl };
+
+ Decl* decl;
+};
+
typedef long long IRIntegerValue;
typedef double IRFloatingPointValue;
@@ -360,6 +402,19 @@ struct IRBuilder
IRValue* val);
IRInst* emitReturn();
+
+ IRDecoration* addDecorationImpl(
+ IRInst* inst,
+ UInt decorationSize,
+ IRDecorationOp op);
+
+ template<typename T>
+ T* addDecoration(IRInst* inst, IRDecorationOp op)
+ {
+ return (T*) addDecorationImpl(inst, sizeof(T), op);
+ }
+
+ IRHighLevelDeclDecoration* addHighLevelDeclDecoration(IRInst* inst, Decl* decl);
};
void dumpIR(IRModule* module);