• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- NaClLLVMBitCodes.h ---------------------------------------*- C++ -*-===//
2 //     Enum values for the NaCl bitcode wire format
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10 //
11 // This header defines Bitcode enum values for NaCl bitcode wire format.
12 //
13 // The enum values defined in this file should be considered permanent.  If
14 // new features are added, they should have values added at the end of the
15 // respective lists.
16 //
17 // Note: PNaCl version 1 is no longer supported, and has been removed from
18 // comments.
19 //
20 //===----------------------------------------------------------------------===//
21 
22 #ifndef LLVM_BITCODE_NACL_NACLLLVMBITCODES_H
23 #define LLVM_BITCODE_NACL_NACLLLVMBITCODES_H
24 
25 #include "llvm/Bitcode/NaCl/NaClBitCodes.h"
26 
27 namespace llvm {
28 namespace naclbitc {
29   // The only top-level block type defined is for a module.
30   enum NaClBlockIDs {
31     // Blocks
32     MODULE_BLOCK_ID          = FIRST_APPLICATION_BLOCKID,
33 
34     // Module sub-block id's.
35     PARAMATTR_BLOCK_ID,        // Not used in PNaCl.
36     PARAMATTR_GROUP_BLOCK_ID,  // Not used in PNaCl.
37 
38     CONSTANTS_BLOCK_ID,
39     FUNCTION_BLOCK_ID,
40 
41     UNUSED_ID1,
42 
43     VALUE_SYMTAB_BLOCK_ID,
44     METADATA_BLOCK_ID,         // Not used in PNaCl.
45     METADATA_ATTACHMENT_ID,    // Not used in PNaCl.
46 
47     TYPE_BLOCK_ID_NEW,
48 
49     USELIST_BLOCK_ID,          // Not used in PNaCl.
50     GLOBALVAR_BLOCK_ID
51   };
52 
53 
54   /// MODULE blocks have a number of optional fields and subblocks.
55   enum NaClModuleCodes {
56     MODULE_CODE_VERSION     = 1,    // VERSION:     [version#]
57     MODULE_CODE_TRIPLE      = 2,    // Not used in PNaCl
58     MODULE_CODE_DATALAYOUT  = 3,    // Not used in PNaCl
59     MODULE_CODE_ASM         = 4,    // Not used in PNaCl
60     MODULE_CODE_SECTIONNAME = 5,    // Not used in PNaCl
61     MODULE_CODE_DEPLIB      = 6,    // Not used in PNaCl
62     MODULE_CODE_GLOBALVAR   = 7,    // Not used in PNaCl
63     // FUNCTION:  [type, callingconv, isproto, linkage]
64     MODULE_CODE_FUNCTION    = 8,
65     MODULE_CODE_ALIAS       = 9,    // Not used in PNaCl
66     MODULE_CODE_PURGEVALS   = 10,   // Not used in PNaCl
67     MODULE_CODE_GCNAME      = 11    // Not used in PNaCl
68   };
69 
70   /// PARAMATTR blocks have code for defining a parameter attribute set.
71   enum NaClAttributeCodes {
72     // FIXME: Remove `PARAMATTR_CODE_ENTRY_OLD' in 4.0
73     PARAMATTR_CODE_ENTRY_OLD  = 1, // ENTRY: [paramidx0, attr0,
74                                    //         paramidx1, attr1...]
75     PARAMATTR_CODE_ENTRY      = 2, // ENTRY: [paramidx0, attrgrp0,
76                                    //         paramidx1, attrgrp1, ...]
77     PARAMATTR_GRP_CODE_ENTRY  = 3  // ENTRY: [id, attr0, att1, ...]
78   };
79 
80   /// TYPE blocks have codes for each type primitive they use.
81   enum NaClTypeCodes {
82     TYPE_CODE_NUMENTRY =  1,    // NUMENTRY: [numentries]
83 
84     // Type Codes
85     TYPE_CODE_VOID     =  2,    // VOID
86     TYPE_CODE_FLOAT    =  3,    // FLOAT
87     TYPE_CODE_DOUBLE   =  4,    // DOUBLE
88     // TODO(mseaborn): Remove LABEL when we drop support for v1 of the
89     // PNaCl bitcode format.  The writer no longer generates it.
90     TYPE_CODE_LABEL    =  5,    // LABEL
91     TYPE_CODE_OPAQUE   =  6,    // Not used in PNaCl.
92     TYPE_CODE_INTEGER  =  7,    // INTEGER: [width]
93     TYPE_CODE_POINTER  =  8,    // POINTER: [pointee type]
94 
95     TYPE_CODE_FUNCTION_OLD = 9, // Not used in PNaCl.
96 
97     TYPE_CODE_HALF     =  10,   // Not used in PNaCl.
98 
99     TYPE_CODE_ARRAY    = 11,    // Not used in PNaCl.
100     TYPE_CODE_VECTOR   = 12,    // VECTOR: [numelts, eltty]
101 
102     // These are not with the other floating point types because they're
103     // a late addition, and putting them in the right place breaks
104     // binary compatibility.
105     TYPE_CODE_X86_FP80 = 13,    // Not used in PNaCl.
106     TYPE_CODE_FP128    = 14,    // Not used in PNaCl.
107     TYPE_CODE_PPC_FP128= 15,    // Not used in PNaCl.
108 
109     TYPE_CODE_METADATA = 16,    // Not used in PNaCl.
110 
111     TYPE_CODE_X86_MMX = 17,     // Not used in PNaCl.
112 
113     TYPE_CODE_STRUCT_ANON = 18, // Not used in PNaCl.
114     TYPE_CODE_STRUCT_NAME = 19, // Not used in PNaCl.
115     TYPE_CODE_STRUCT_NAMED = 20,// Not used in PNaCl.
116 
117     TYPE_CODE_FUNCTION = 21     // FUNCTION: [vararg, retty, paramty x N]
118   };
119 
120   // The type symbol table only has one code (TST_ENTRY_CODE).
121   enum NaClTypeSymtabCodes {
122     TST_CODE_ENTRY = 1     // TST_ENTRY: [typeid, namechar x N]
123   };
124 
125   // The value symbol table only has one code (VST_ENTRY_CODE).
126   enum NaClValueSymtabCodes {
127     VST_CODE_ENTRY   = 1,  // VST_ENTRY: [valid, namechar x N]
128     VST_CODE_BBENTRY = 2   // VST_BBENTRY: [bbid, namechar x N]
129   };
130 
131   // Not used in PNaCl.
132   enum NaClMetadataCodes {
133     METADATA_STRING        = 1,   // MDSTRING:      [values]
134     // 2 is unused.
135     // 3 is unused.
136     METADATA_NAME          = 4,   // STRING:        [values]
137     // 5 is unused.
138     METADATA_KIND          = 6,   // [n x [id, name]]
139     // 7 is unused.
140     METADATA_NODE          = 8,   // NODE:          [n x (type num, value num)]
141     METADATA_FN_NODE       = 9,   // FN_NODE:       [n x (type num, value num)]
142     METADATA_NAMED_NODE    = 10,  // NAMED_NODE:    [n x mdnodes]
143     METADATA_ATTACHMENT    = 11   // [m x [value, [n x [id, mdnode]]]
144   };
145 
146   // The constants block (CONSTANTS_BLOCK_ID) describes emission for each
147   // constant and maintains an implicit current type value.
148   enum NaClConstantsCodes {
149     CST_CODE_SETTYPE       =  1,  // SETTYPE:       [typeid]
150     CST_CODE_NULL          =  2,  // Not used in PNaCl.
151     CST_CODE_UNDEF         =  3,  // UNDEF
152     CST_CODE_INTEGER       =  4,  // INTEGER:       [intval]
153     CST_CODE_WIDE_INTEGER  =  5,  // Not used in PNaCl.
154     CST_CODE_FLOAT         =  6,  // FLOAT:         [fpval]
155     CST_CODE_AGGREGATE     =  7,  // Not used in PNaCl.
156     CST_CODE_STRING        =  8,  // Not used in PNaCl.
157     CST_CODE_CSTRING       =  9,  // Not used in PNaCl.
158     CST_CODE_CE_BINOP      = 10,  // Not used in PNaCl.
159     CST_CODE_CE_CAST       = 11,  // Not used in PNaCl.
160     CST_CODE_CE_GEP        = 12,  // Not used in PNaCl.
161     CST_CODE_CE_SELECT     = 13,  // Not used in PNaCl.
162     CST_CODE_CE_EXTRACTELT = 14,  // Not used in PNaCl.
163     CST_CODE_CE_INSERTELT  = 15,  // Not used in PNaCl.
164     CST_CODE_CE_SHUFFLEVEC = 16,  // Not used in PNaCl.
165     CST_CODE_CE_CMP        = 17,  // Not used in PNaCl.
166     CST_CODE_INLINEASM_OLD = 18,  // No longer used.
167     CST_CODE_CE_SHUFVEC_EX = 19,  // Not used in PNaCl.
168     CST_CODE_CE_INBOUNDS_GEP = 20,// Not used in PNaCl.
169     CST_CODE_BLOCKADDRESS  = 21,  // Not used in PNaCl.
170     CST_CODE_DATA          = 22,  // Not used in PNaCl.
171     CST_CODE_INLINEASM     = 23   // Not used in PNaCl.
172   };
173 
174   /// GlobalVarOpcodes - These are values used in the bitcode files to
175   /// encode records defining global variables.
176   ///
177   /// The structure of global variables can be summarized as follows:
178   ///
179   /// The global variable block begins with a GLOBALVAR_COUNT, defining
180   /// the number of global variables in the bitcode file. After that,
181   /// each global variable is defined.
182   ///
183   /// Global variables are defined by a GLOBALVAR_VAR record, followed
184   /// by 1 or more records defining its initial value. Simple
185   /// variables have a single initializer. Structured variables are
186   /// defined by an initial GLOBALVAR_COMPOUND record defining the
187   /// number of fields in the structure, followed by an initializer
188   /// for each of its fields. In this context, a field is either data,
189   /// or a relocation.  A data field is defined by a
190   /// GLOBALVAR_ZEROFILL or GLOBALVAR_DATA record.  A relocation field
191   /// is defined by a GLOBALVAR_RELOC record.
192   enum NaClGlobalVarOpcodes {
193     GLOBALVAR_VAR        = 0,     // VAR: [align, isconst]
194     GLOBALVAR_COMPOUND   = 1,     // COMPOUND: [size]
195     GLOBALVAR_ZEROFILL   = 2,     // ZEROFILL: [size]
196     GLOBALVAR_DATA       = 3,     // DATA: [b0, b1, ...]
197     GLOBALVAR_RELOC      = 4,     // RELOC: [val, [addend]]
198     GLOBALVAR_COUNT      = 5      // COUNT: [n]
199   };
200 
201   /// CastOpcodes - These are values used in the bitcode files to encode which
202   /// cast a CST_CODE_CE_CAST or a XXX refers to.  The values of these enums
203   /// have no fixed relation to the LLVM IR enum values.  Changing these will
204   /// break compatibility with old files.
205   enum NaClCastOpcodes {
206     CAST_TRUNC    =  0,
207     CAST_ZEXT     =  1,
208     CAST_SEXT     =  2,
209     CAST_FPTOUI   =  3,
210     CAST_FPTOSI   =  4,
211     CAST_UITOFP   =  5,
212     CAST_SITOFP   =  6,
213     CAST_FPTRUNC  =  7,
214     CAST_FPEXT    =  8,
215     // 9 was CAST_PTRTOINT; not used in PNaCl.
216     // 10 was CAST_INTTOPTR; not used in PNaCl.
217     CAST_BITCAST  = 11
218   };
219 
220   /// BinaryOpcodes - These are values used in the bitcode files to encode which
221   /// binop a CST_CODE_CE_BINOP or a XXX refers to.  The values of these enums
222   /// have no fixed relation to the LLVM IR enum values.  Changing these will
223   /// break compatibility with old files.
224   enum NaClBinaryOpcodes {
225     BINOP_ADD  =  0,
226     BINOP_SUB  =  1,
227     BINOP_MUL  =  2,
228     BINOP_UDIV =  3,
229     BINOP_SDIV =  4,    // overloaded for FP
230     BINOP_UREM =  5,
231     BINOP_SREM =  6,    // overloaded for FP
232     BINOP_SHL  =  7,
233     BINOP_LSHR =  8,
234     BINOP_ASHR =  9,
235     BINOP_AND  = 10,
236     BINOP_OR   = 11,
237     BINOP_XOR  = 12
238   };
239 
240   /// OverflowingBinaryOperatorOptionalFlags - Flags for serializing
241   /// OverflowingBinaryOperator's SubclassOptionalData contents.
242   /// Note: This enum is no longer used in PNaCl, because these
243   /// flags can't exist in files that meet the PNaCl ABI.
244   enum NaClOverflowingBinaryOperatorOptionalFlags {
245     OBO_NO_UNSIGNED_WRAP = 0,
246     OBO_NO_SIGNED_WRAP = 1
247   };
248 
249   /// PossiblyExactOperatorOptionalFlags - Flags for serializing
250   /// PossiblyExactOperator's SubclassOptionalData contents.
251   /// Note: This enum is no longer used in PNaCl, because these
252   /// flags can't exist in files that meet the PNaCl ABI.
253   enum NaClPossiblyExactOperatorOptionalFlags {
254     PEO_EXACT = 0
255   };
256 
257   /// \brief Flags for serializing floating point binary operators's
258   /// SubclassOptionalData contents.
259   /// Note: This enum is no longer used in PNaCl, because these
260   /// flags shouldn't exist in files that meet the PNaCl ABI, unless
261   /// they are old. In the latter case, they are ignored by the reader.
262   enum NaClFloatingPointBinaryOperatorOptionalFlags {
263     FPO_UNSAFE_ALGEBRA = 0,
264     FPO_NO_NANS = 1,
265     FPO_NO_INFS = 2,
266     FPO_NO_SIGNED_ZEROS = 3,
267     FPO_ALLOW_RECIPROCAL = 4
268   };
269 
270   /// Encoded function calling conventions.
271   enum NaClCallingConventions {
272     C_CallingConv = 0
273   };
274 
275   /// Encoded comparison predicates.
276   enum NaClComparisonPredicates {
277     // Opcode              U L G E    Intuitive operation
278     FCMP_FALSE =  0,  ///< 0 0 0 0    Always false (always folded)
279     FCMP_OEQ   =  1,  ///< 0 0 0 1    True if ordered and equal
280     FCMP_OGT   =  2,  ///< 0 0 1 0    True if ordered and greater than
281     FCMP_OGE   =  3,  ///< 0 0 1 1    True if ordered and greater than or equal
282     FCMP_OLT   =  4,  ///< 0 1 0 0    True if ordered and less than
283     FCMP_OLE   =  5,  ///< 0 1 0 1    True if ordered and less than or equal
284     FCMP_ONE   =  6,  ///< 0 1 1 0    True if ordered and operands are unequal
285     FCMP_ORD   =  7,  ///< 0 1 1 1    True if ordered (no nans)
286     FCMP_UNO   =  8,  ///< 1 0 0 0    True if unordered: isnan(X) | isnan(Y)
287     FCMP_UEQ   =  9,  ///< 1 0 0 1    True if unordered or equal
288     FCMP_UGT   = 10,  ///< 1 0 1 0    True if unordered or greater than
289     FCMP_UGE   = 11,  ///< 1 0 1 1    True if unordered, greater than, or equal
290     FCMP_ULT   = 12,  ///< 1 1 0 0    True if unordered or less than
291     FCMP_ULE   = 13,  ///< 1 1 0 1    True if unordered, less than, or equal
292     FCMP_UNE   = 14,  ///< 1 1 1 0    True if unordered or not equal
293     FCMP_TRUE  = 15,  ///< 1 1 1 1    Always true (always folded)
294     ICMP_EQ    = 32,  ///< equal
295     ICMP_NE    = 33,  ///< not equal
296     ICMP_UGT   = 34,  ///< unsigned greater than
297     ICMP_UGE   = 35,  ///< unsigned greater or equal
298     ICMP_ULT   = 36,  ///< unsigned less than
299     ICMP_ULE   = 37,  ///< unsigned less or equal
300     ICMP_SGT   = 38,  ///< signed greater than
301     ICMP_SGE   = 39,  ///< signed greater or equal
302     ICMP_SLT   = 40,  ///< signed less than
303     ICMP_SLE   = 41   ///< signed less or equal
304   };
305 
306   enum NaClLinkageTypes {
307     LINKAGE_EXTERNAL = 0,
308     LINKAGE_INTERNAL = 3
309   };
310 
311   // The function body block (FUNCTION_BLOCK_ID) describes function bodies.  It
312   // can contain a constant block (CONSTANTS_BLOCK_ID).
313   enum NaClFunctionCodes {
314     FUNC_CODE_DECLAREBLOCKS    =  1, // DECLAREBLOCKS: [n]
315 
316     FUNC_CODE_INST_BINOP       =  2, // BINOP:      [opval, opval, opcode]
317                                      // Note: because old PNaCl bitcode files
318                                      // may contain flags (which we now ignore),
319                                      // the reader must also support:
320                                      // BINOP: [opval, opval, opcode, flags]
321     FUNC_CODE_INST_CAST        =  3, // CAST:       [opval, destty, castopc]
322     FUNC_CODE_INST_GEP         =  4, // Not used in PNaCl.
323     FUNC_CODE_INST_SELECT      =  5, // Not used in PNaCl. Replaced by VSELECT.
324     FUNC_CODE_INST_EXTRACTELT  =  6, // EXTRACTELT: [opval, opval]
325     FUNC_CODE_INST_INSERTELT   =  7, // INSERTELT:  [opval, opval, opval]
326     FUNC_CODE_INST_SHUFFLEVEC  =  8, // Not used in PNaCl.
327     FUNC_CODE_INST_CMP         =  9, // Not used in PNaCl. Replaced by CMP2.
328     FUNC_CODE_INST_RET         = 10, // RET:        [opval<optional>]
329     FUNC_CODE_INST_BR          = 11, // BR:         [bb#, bb#, cond] or [bb#]
330     FUNC_CODE_INST_SWITCH      = 12, // SWITCH:     [opty, op0, op1, ...]
331     FUNC_CODE_INST_INVOKE      = 13, // Not used in PNaCl.
332     // 14 is unused.
333     FUNC_CODE_INST_UNREACHABLE = 15, // UNREACHABLE
334 
335     FUNC_CODE_INST_PHI         = 16, // PHI:        [ty, val0,bb0, ...]
336     // 17 is unused.
337     // 18 is unused.
338     FUNC_CODE_INST_ALLOCA      = 19, // ALLOCA:     [op, align]
339     FUNC_CODE_INST_LOAD        = 20, // LOAD: [op, align, ty]
340     // 21 is unused.
341     // 22 is unused.
342     FUNC_CODE_INST_VAARG       = 23, // Not used in PNaCl.
343     FUNC_CODE_INST_STORE       = 24, // STORE: [ptr, val, align]
344     // 25 is unused.
345     FUNC_CODE_INST_EXTRACTVAL  = 26, // Not used in PNaCl.
346     FUNC_CODE_INST_INSERTVAL   = 27, // Not used in PNaCl.
347     // fcmp/icmp returning Int1TY or vector of Int1Ty. Same as CMP, exists to
348     // support legacy vicmp/vfcmp instructions.
349     FUNC_CODE_INST_CMP2        = 28, // CMP2:       [opval, opval, pred]
350     // new select on i1 or [N x i1]
351     FUNC_CODE_INST_VSELECT     = 29, // VSELECT:    [opval, opval, pred]
352     FUNC_CODE_INST_INBOUNDS_GEP= 30, // Not used in PNaCl.
353     FUNC_CODE_INST_INDIRECTBR  = 31, // Not used in PNaCl.
354     // 32 is unused.
355     FUNC_CODE_DEBUG_LOC_AGAIN  = 33, // Not used in PNaCl.
356 
357     FUNC_CODE_INST_CALL        = 34, // CALL: [cc, fnid, args...]
358                                      // See FUNC_CODE_INST_CALL_INDIRECT below.
359     FUNC_CODE_DEBUG_LOC        = 35, // Not used in PNaCl.
360     FUNC_CODE_INST_FENCE       = 36, // Not used in PNaCl.
361     FUNC_CODE_INST_CMPXCHG     = 37, // Not used in PNaCl.
362     FUNC_CODE_INST_ATOMICRMW   = 38, // Not used in PNaCl.
363     FUNC_CODE_INST_RESUME      = 39, // Not used in PNaCl.
364     FUNC_CODE_INST_LANDINGPAD  = 40, // Not used in PNaCl.
365     FUNC_CODE_INST_LOADATOMIC  = 41, // Not used in PNaCl.
366     FUNC_CODE_INST_STOREATOMIC = 42, // Not used in PNaCl.
367     FUNC_CODE_INST_FORWARDTYPEREF = 43, // TYPE: [opval, ty]
368     // CALL_INDIRECT: [cc, fnid, returnty, args...]
369     FUNC_CODE_INST_CALL_INDIRECT = 44
370   };
371 } // End naclbitc namespace
372 } // End llvm namespace
373 
374 #endif
375