|
| 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 | +//===----------------------------------------------------------------------===// |
| 18 | + |
| 19 | +#ifndef LLVM_BITCODE_NACL_NACLBITCODES_H |
| 20 | +#define LLVM_BITCODE_NACL_NACLBITCODES_H |
| 21 | + |
| 22 | +// TODO(kschimpf) Make a NaCl version of BitCodes.h, so that block id's |
| 23 | +// and abbreviations can be modified. |
| 24 | +#include "llvm/Bitcode/BitCodes.h" |
| 25 | + |
| 26 | +namespace llvm { |
| 27 | +namespace naclbitc { |
| 28 | + // The only top-level block type defined is for a module. |
| 29 | + enum NaClBlockIDs { |
| 30 | + // Blocks |
| 31 | + MODULE_BLOCK_ID = bitc::FIRST_APPLICATION_BLOCKID, |
| 32 | + |
| 33 | + // Module sub-block id's. |
| 34 | + PARAMATTR_BLOCK_ID, |
| 35 | + PARAMATTR_GROUP_BLOCK_ID, |
| 36 | + |
| 37 | + CONSTANTS_BLOCK_ID, |
| 38 | + FUNCTION_BLOCK_ID, |
| 39 | + |
| 40 | + UNUSED_ID1, |
| 41 | + |
| 42 | + VALUE_SYMTAB_BLOCK_ID, |
| 43 | + METADATA_BLOCK_ID, |
| 44 | + METADATA_ATTACHMENT_ID, |
| 45 | + |
| 46 | + TYPE_BLOCK_ID_NEW, |
| 47 | + |
| 48 | + USELIST_BLOCK_ID |
| 49 | + }; |
| 50 | + |
| 51 | + |
| 52 | + /// MODULE blocks have a number of optional fields and subblocks. |
| 53 | + enum NaClModuleCodes { |
| 54 | + MODULE_CODE_VERSION = 1, // VERSION: [version#] |
| 55 | + MODULE_CODE_TRIPLE = 2, // TRIPLE: [strchr x N] |
| 56 | + MODULE_CODE_DATALAYOUT = 3, // DATALAYOUT: [strchr x N] |
| 57 | + MODULE_CODE_ASM = 4, // ASM: [strchr x N] |
| 58 | + MODULE_CODE_SECTIONNAME = 5, // SECTIONNAME: [strchr x N] |
| 59 | + |
| 60 | + // FIXME: Remove DEPLIB in 4.0. |
| 61 | + MODULE_CODE_DEPLIB = 6, // DEPLIB: [strchr x N] |
| 62 | + |
| 63 | + // GLOBALVAR: [pointer type, isconst, initid, |
| 64 | + // linkage, alignment, section, visibility, threadlocal] |
| 65 | + MODULE_CODE_GLOBALVAR = 7, |
| 66 | + |
| 67 | + // FUNCTION: [type, callingconv, isproto, linkage, paramattrs, alignment, |
| 68 | + // section, visibility, gc, unnamed_addr] |
| 69 | + MODULE_CODE_FUNCTION = 8, |
| 70 | + |
| 71 | + // ALIAS: [alias type, aliasee val#, linkage, visibility] |
| 72 | + MODULE_CODE_ALIAS = 9, |
| 73 | + |
| 74 | + // MODULE_CODE_PURGEVALS: [numvals] |
| 75 | + MODULE_CODE_PURGEVALS = 10, |
| 76 | + |
| 77 | + MODULE_CODE_GCNAME = 11 // GCNAME: [strchr x N] |
| 78 | + }; |
| 79 | + |
| 80 | + /// PARAMATTR blocks have code for defining a parameter attribute set. |
| 81 | + enum NaClAttributeCodes { |
| 82 | + // FIXME: Remove `PARAMATTR_CODE_ENTRY_OLD' in 4.0 |
| 83 | + PARAMATTR_CODE_ENTRY_OLD = 1, // ENTRY: [paramidx0, attr0, |
| 84 | + // paramidx1, attr1...] |
| 85 | + PARAMATTR_CODE_ENTRY = 2, // ENTRY: [paramidx0, attrgrp0, |
| 86 | + // paramidx1, attrgrp1, ...] |
| 87 | + PARAMATTR_GRP_CODE_ENTRY = 3 // ENTRY: [id, attr0, att1, ...] |
| 88 | + }; |
| 89 | + |
| 90 | + /// TYPE blocks have codes for each type primitive they use. |
| 91 | + enum NaClTypeCodes { |
| 92 | + TYPE_CODE_NUMENTRY = 1, // NUMENTRY: [numentries] |
| 93 | + |
| 94 | + // Type Codes |
| 95 | + TYPE_CODE_VOID = 2, // VOID |
| 96 | + TYPE_CODE_FLOAT = 3, // FLOAT |
| 97 | + TYPE_CODE_DOUBLE = 4, // DOUBLE |
| 98 | + TYPE_CODE_LABEL = 5, // LABEL |
| 99 | + TYPE_CODE_OPAQUE = 6, // OPAQUE |
| 100 | + TYPE_CODE_INTEGER = 7, // INTEGER: [width] |
| 101 | + TYPE_CODE_POINTER = 8, // POINTER: [pointee type] |
| 102 | + |
| 103 | + TYPE_CODE_FUNCTION_OLD = 9, // FUNCTION: [vararg, attrid, retty, |
| 104 | + // paramty x N] |
| 105 | + |
| 106 | + TYPE_CODE_HALF = 10, // HALF |
| 107 | + |
| 108 | + TYPE_CODE_ARRAY = 11, // ARRAY: [numelts, eltty] |
| 109 | + TYPE_CODE_VECTOR = 12, // VECTOR: [numelts, eltty] |
| 110 | + |
| 111 | + // These are not with the other floating point types because they're |
| 112 | + // a late addition, and putting them in the right place breaks |
| 113 | + // binary compatibility. |
| 114 | + TYPE_CODE_X86_FP80 = 13, // X86 LONG DOUBLE |
| 115 | + TYPE_CODE_FP128 = 14, // LONG DOUBLE (112 bit mantissa) |
| 116 | + TYPE_CODE_PPC_FP128= 15, // PPC LONG DOUBLE (2 doubles) |
| 117 | + |
| 118 | + TYPE_CODE_METADATA = 16, // METADATA |
| 119 | + |
| 120 | + TYPE_CODE_X86_MMX = 17, // X86 MMX |
| 121 | + |
| 122 | + TYPE_CODE_STRUCT_ANON = 18, // STRUCT_ANON: [ispacked, eltty x N] |
| 123 | + TYPE_CODE_STRUCT_NAME = 19, // STRUCT_NAME: [strchr x N] |
| 124 | + TYPE_CODE_STRUCT_NAMED = 20,// STRUCT_NAMED: [ispacked, eltty x N] |
| 125 | + |
| 126 | + TYPE_CODE_FUNCTION = 21 // FUNCTION: [vararg, retty, paramty x N] |
| 127 | + }; |
| 128 | + |
| 129 | + // The type symbol table only has one code (TST_ENTRY_CODE). |
| 130 | + enum NaClTypeSymtabCodes { |
| 131 | + TST_CODE_ENTRY = 1 // TST_ENTRY: [typeid, namechar x N] |
| 132 | + }; |
| 133 | + |
| 134 | + // The value symbol table only has one code (VST_ENTRY_CODE). |
| 135 | + enum NaClValueSymtabCodes { |
| 136 | + VST_CODE_ENTRY = 1, // VST_ENTRY: [valid, namechar x N] |
| 137 | + VST_CODE_BBENTRY = 2 // VST_BBENTRY: [bbid, namechar x N] |
| 138 | + }; |
| 139 | + |
| 140 | + enum NaClMetadataCodes { |
| 141 | + METADATA_STRING = 1, // MDSTRING: [values] |
| 142 | + // 2 is unused. |
| 143 | + // 3 is unused. |
| 144 | + METADATA_NAME = 4, // STRING: [values] |
| 145 | + // 5 is unused. |
| 146 | + METADATA_KIND = 6, // [n x [id, name]] |
| 147 | + // 7 is unused. |
| 148 | + METADATA_NODE = 8, // NODE: [n x (type num, value num)] |
| 149 | + METADATA_FN_NODE = 9, // FN_NODE: [n x (type num, value num)] |
| 150 | + METADATA_NAMED_NODE = 10, // NAMED_NODE: [n x mdnodes] |
| 151 | + METADATA_ATTACHMENT = 11 // [m x [value, [n x [id, mdnode]]] |
| 152 | + }; |
| 153 | + |
| 154 | + // The constants block (CONSTANTS_BLOCK_ID) describes emission for each |
| 155 | + // constant and maintains an implicit current type value. |
| 156 | + enum NaClConstantsCodes { |
| 157 | + CST_CODE_SETTYPE = 1, // SETTYPE: [typeid] |
| 158 | + CST_CODE_NULL = 2, // NULL |
| 159 | + CST_CODE_UNDEF = 3, // UNDEF |
| 160 | + CST_CODE_INTEGER = 4, // INTEGER: [intval] |
| 161 | + CST_CODE_WIDE_INTEGER = 5, // WIDE_INTEGER: [n x intval] |
| 162 | + CST_CODE_FLOAT = 6, // FLOAT: [fpval] |
| 163 | + CST_CODE_AGGREGATE = 7, // AGGREGATE: [n x value number] |
| 164 | + CST_CODE_STRING = 8, // STRING: [values] |
| 165 | + CST_CODE_CSTRING = 9, // CSTRING: [values] |
| 166 | + CST_CODE_CE_BINOP = 10, // CE_BINOP: [opcode, opval, opval] |
| 167 | + CST_CODE_CE_CAST = 11, // CE_CAST: [opcode, opty, opval] |
| 168 | + CST_CODE_CE_GEP = 12, // CE_GEP: [n x operands] |
| 169 | + CST_CODE_CE_SELECT = 13, // CE_SELECT: [opval, opval, opval] |
| 170 | + CST_CODE_CE_EXTRACTELT = 14, // CE_EXTRACTELT: [opty, opval, opval] |
| 171 | + CST_CODE_CE_INSERTELT = 15, // CE_INSERTELT: [opval, opval, opval] |
| 172 | + CST_CODE_CE_SHUFFLEVEC = 16, // CE_SHUFFLEVEC: [opval, opval, opval] |
| 173 | + CST_CODE_CE_CMP = 17, // CE_CMP: [opty, opval, opval, pred] |
| 174 | + CST_CODE_INLINEASM_OLD = 18, // INLINEASM: [sideeffect|alignstack, |
| 175 | + // asmstr,conststr] |
| 176 | + CST_CODE_CE_SHUFVEC_EX = 19, // SHUFVEC_EX: [opty, opval, opval, opval] |
| 177 | + CST_CODE_CE_INBOUNDS_GEP = 20,// INBOUNDS_GEP: [n x operands] |
| 178 | + CST_CODE_BLOCKADDRESS = 21, // CST_CODE_BLOCKADDRESS [fnty, fnval, bb#] |
| 179 | + CST_CODE_DATA = 22, // DATA: [n x elements] |
| 180 | + CST_CODE_INLINEASM = 23 // INLINEASM: [sideeffect|alignstack| |
| 181 | + // asmdialect,asmstr,conststr] |
| 182 | + }; |
| 183 | + |
| 184 | + /// CastOpcodes - These are values used in the bitcode files to encode which |
| 185 | + /// cast a CST_CODE_CE_CAST or a XXX refers to. The values of these enums |
| 186 | + /// have no fixed relation to the LLVM IR enum values. Changing these will |
| 187 | + /// break compatibility with old files. |
| 188 | + enum NaClCastOpcodes { |
| 189 | + CAST_TRUNC = 0, |
| 190 | + CAST_ZEXT = 1, |
| 191 | + CAST_SEXT = 2, |
| 192 | + CAST_FPTOUI = 3, |
| 193 | + CAST_FPTOSI = 4, |
| 194 | + CAST_UITOFP = 5, |
| 195 | + CAST_SITOFP = 6, |
| 196 | + CAST_FPTRUNC = 7, |
| 197 | + CAST_FPEXT = 8, |
| 198 | + CAST_PTRTOINT = 9, |
| 199 | + CAST_INTTOPTR = 10, |
| 200 | + CAST_BITCAST = 11 |
| 201 | + }; |
| 202 | + |
| 203 | + /// BinaryOpcodes - These are values used in the bitcode files to encode which |
| 204 | + /// binop a CST_CODE_CE_BINOP or a XXX refers to. The values of these enums |
| 205 | + /// have no fixed relation to the LLVM IR enum values. Changing these will |
| 206 | + /// break compatibility with old files. |
| 207 | + enum NaClBinaryOpcodes { |
| 208 | + BINOP_ADD = 0, |
| 209 | + BINOP_SUB = 1, |
| 210 | + BINOP_MUL = 2, |
| 211 | + BINOP_UDIV = 3, |
| 212 | + BINOP_SDIV = 4, // overloaded for FP |
| 213 | + BINOP_UREM = 5, |
| 214 | + BINOP_SREM = 6, // overloaded for FP |
| 215 | + BINOP_SHL = 7, |
| 216 | + BINOP_LSHR = 8, |
| 217 | + BINOP_ASHR = 9, |
| 218 | + BINOP_AND = 10, |
| 219 | + BINOP_OR = 11, |
| 220 | + BINOP_XOR = 12 |
| 221 | + }; |
| 222 | + |
| 223 | + /// These are values used in the bitcode files to encode AtomicRMW operations. |
| 224 | + /// The values of these enums have no fixed relation to the LLVM IR enum |
| 225 | + /// values. Changing these will break compatibility with old files. |
| 226 | + enum NaClRMWOperations { |
| 227 | + RMW_XCHG = 0, |
| 228 | + RMW_ADD = 1, |
| 229 | + RMW_SUB = 2, |
| 230 | + RMW_AND = 3, |
| 231 | + RMW_NAND = 4, |
| 232 | + RMW_OR = 5, |
| 233 | + RMW_XOR = 6, |
| 234 | + RMW_MAX = 7, |
| 235 | + RMW_MIN = 8, |
| 236 | + RMW_UMAX = 9, |
| 237 | + RMW_UMIN = 10 |
| 238 | + }; |
| 239 | + |
| 240 | + /// OverflowingBinaryOperatorOptionalFlags - Flags for serializing |
| 241 | + /// OverflowingBinaryOperator's SubclassOptionalData contents. |
| 242 | + enum NaClOverflowingBinaryOperatorOptionalFlags { |
| 243 | + OBO_NO_UNSIGNED_WRAP = 0, |
| 244 | + OBO_NO_SIGNED_WRAP = 1 |
| 245 | + }; |
| 246 | + |
| 247 | + /// PossiblyExactOperatorOptionalFlags - Flags for serializing |
| 248 | + /// PossiblyExactOperator's SubclassOptionalData contents. |
| 249 | + enum NaClPossiblyExactOperatorOptionalFlags { |
| 250 | + PEO_EXACT = 0 |
| 251 | + }; |
| 252 | + |
| 253 | + /// Encoded AtomicOrdering values. |
| 254 | + enum NaClAtomicOrderingCodes { |
| 255 | + ORDERING_NOTATOMIC = 0, |
| 256 | + ORDERING_UNORDERED = 1, |
| 257 | + ORDERING_MONOTONIC = 2, |
| 258 | + ORDERING_ACQUIRE = 3, |
| 259 | + ORDERING_RELEASE = 4, |
| 260 | + ORDERING_ACQREL = 5, |
| 261 | + ORDERING_SEQCST = 6 |
| 262 | + }; |
| 263 | + |
| 264 | + /// Encoded SynchronizationScope values. |
| 265 | + enum NaClAtomicSynchScopeCodes { |
| 266 | + SYNCHSCOPE_SINGLETHREAD = 0, |
| 267 | + SYNCHSCOPE_CROSSTHREAD = 1 |
| 268 | + }; |
| 269 | + |
| 270 | + // The function body block (FUNCTION_BLOCK_ID) describes function bodies. It |
| 271 | + // can contain a constant block (CONSTANTS_BLOCK_ID). |
| 272 | + enum NaClFunctionCodes { |
| 273 | + FUNC_CODE_DECLAREBLOCKS = 1, // DECLAREBLOCKS: [n] |
| 274 | + |
| 275 | + FUNC_CODE_INST_BINOP = 2, // BINOP: [opcode, ty, opval, opval] |
| 276 | + FUNC_CODE_INST_CAST = 3, // CAST: [opcode, ty, opty, opval] |
| 277 | + FUNC_CODE_INST_GEP = 4, // GEP: [n x operands] |
| 278 | + FUNC_CODE_INST_SELECT = 5, // SELECT: [ty, opval, opval, opval] |
| 279 | + FUNC_CODE_INST_EXTRACTELT = 6, // EXTRACTELT: [opty, opval, opval] |
| 280 | + FUNC_CODE_INST_INSERTELT = 7, // INSERTELT: [ty, opval, opval, opval] |
| 281 | + FUNC_CODE_INST_SHUFFLEVEC = 8, // SHUFFLEVEC: [ty, opval, opval, opval] |
| 282 | + FUNC_CODE_INST_CMP = 9, // CMP: [opty, opval, opval, pred] |
| 283 | + |
| 284 | + FUNC_CODE_INST_RET = 10, // RET: [opty,opval<both optional>] |
| 285 | + FUNC_CODE_INST_BR = 11, // BR: [bb#, bb#, cond] or [bb#] |
| 286 | + FUNC_CODE_INST_SWITCH = 12, // SWITCH: [opty, op0, op1, ...] |
| 287 | + FUNC_CODE_INST_INVOKE = 13, // INVOKE: [attr, fnty, op0,op1, ...] |
| 288 | + // 14 is unused. |
| 289 | + FUNC_CODE_INST_UNREACHABLE = 15, // UNREACHABLE |
| 290 | + |
| 291 | + FUNC_CODE_INST_PHI = 16, // PHI: [ty, val0,bb0, ...] |
| 292 | + // 17 is unused. |
| 293 | + // 18 is unused. |
| 294 | + FUNC_CODE_INST_ALLOCA = 19, // ALLOCA: [instty, op, align] |
| 295 | + FUNC_CODE_INST_LOAD = 20, // LOAD: [opty, op, align, vol] |
| 296 | + // 21 is unused. |
| 297 | + // 22 is unused. |
| 298 | + FUNC_CODE_INST_VAARG = 23, // VAARG: [valistty, valist, instty] |
| 299 | + // This store code encodes the pointer type, rather than the value type |
| 300 | + // this is so information only available in the pointer type (e.g. address |
| 301 | + // spaces) is retained. |
| 302 | + FUNC_CODE_INST_STORE = 24, // STORE: [ptrty,ptr,val, align, vol] |
| 303 | + // 25 is unused. |
| 304 | + FUNC_CODE_INST_EXTRACTVAL = 26, // EXTRACTVAL: [n x operands] |
| 305 | + FUNC_CODE_INST_INSERTVAL = 27, // INSERTVAL: [n x operands] |
| 306 | + // fcmp/icmp returning Int1TY or vector of Int1Ty. Same as CMP, exists to |
| 307 | + // support legacy vicmp/vfcmp instructions. |
| 308 | + FUNC_CODE_INST_CMP2 = 28, // CMP2: [opty, opval, opval, pred] |
| 309 | + // new select on i1 or [N x i1] |
| 310 | + FUNC_CODE_INST_VSELECT = 29, // VSELECT: [ty,opval,opval,predty,pred] |
| 311 | + FUNC_CODE_INST_INBOUNDS_GEP= 30, // INBOUNDS_GEP: [n x operands] |
| 312 | + FUNC_CODE_INST_INDIRECTBR = 31, // INDIRECTBR: [opty, op0, op1, ...] |
| 313 | + // 32 is unused. |
| 314 | + FUNC_CODE_DEBUG_LOC_AGAIN = 33, // DEBUG_LOC_AGAIN |
| 315 | + |
| 316 | + FUNC_CODE_INST_CALL = 34, // CALL: [attr, fnty, fnid, args...] |
| 317 | + |
| 318 | + FUNC_CODE_DEBUG_LOC = 35, // DEBUG_LOC: [Line,Col,ScopeVal, IAVal] |
| 319 | + FUNC_CODE_INST_FENCE = 36, // FENCE: [ordering, synchscope] |
| 320 | + FUNC_CODE_INST_CMPXCHG = 37, // CMPXCHG: [ptrty,ptr,cmp,new, align, vol, |
| 321 | + // ordering, synchscope] |
| 322 | + FUNC_CODE_INST_ATOMICRMW = 38, // ATOMICRMW: [ptrty,ptr,val, operation, |
| 323 | + // align, vol, |
| 324 | + // ordering, synchscope] |
| 325 | + FUNC_CODE_INST_RESUME = 39, // RESUME: [opval] |
| 326 | + FUNC_CODE_INST_LANDINGPAD = 40, // LANDINGPAD: [ty,val,val,num,id0,val0...] |
| 327 | + FUNC_CODE_INST_LOADATOMIC = 41, // LOAD: [opty, op, align, vol, |
| 328 | + // ordering, synchscope] |
| 329 | + FUNC_CODE_INST_STOREATOMIC = 42 // STORE: [ptrty,ptr,val, align, vol |
| 330 | + // ordering, synchscope] |
| 331 | + }; |
| 332 | + |
| 333 | + enum NaClUseListCodes { |
| 334 | + USELIST_CODE_ENTRY = 1 // USELIST_CODE_ENTRY: TBD. |
| 335 | + }; |
| 336 | +} // End naclbitc namespace |
| 337 | +} // End llvm namespace |
| 338 | + |
| 339 | +#endif |
0 commit comments