| OLD | NEW |
| 1 //===--- Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp - Bitcode Writer -------===// | 1 //===--- Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp - Bitcode Writer -------===// |
| 2 // | 2 // |
| 3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 // | 9 // |
| 10 // Bitcode writer implementation. | 10 // Bitcode writer implementation. |
| 11 // | 11 // |
| 12 //===----------------------------------------------------------------------===// | 12 //===----------------------------------------------------------------------===// |
| 13 | 13 |
| 14 #include "llvm/Bitcode/NaCl/NaClReaderWriter.h" | 14 #include "llvm/Bitcode/NaCl/NaClReaderWriter.h" |
| 15 #include "NaClValueEnumerator.h" | 15 #include "NaClValueEnumerator.h" |
| 16 #include "llvm/ADT/Triple.h" | 16 #include "llvm/ADT/Triple.h" |
| 17 #include "llvm/Bitcode/NaCl/NaClBitstreamWriter.h" | 17 #include "llvm/Bitcode/NaCl/NaClBitstreamWriter.h" |
| 18 #include "llvm/Bitcode/LLVMBitCodes.h" | 18 #include "llvm/Bitcode/NaCl/NaClBitCodes.h" |
| 19 #include "llvm/IR/Constants.h" | 19 #include "llvm/IR/Constants.h" |
| 20 #include "llvm/IR/DerivedTypes.h" | 20 #include "llvm/IR/DerivedTypes.h" |
| 21 #include "llvm/IR/InlineAsm.h" | 21 #include "llvm/IR/InlineAsm.h" |
| 22 #include "llvm/IR/Instructions.h" | 22 #include "llvm/IR/Instructions.h" |
| 23 #include "llvm/IR/Module.h" | 23 #include "llvm/IR/Module.h" |
| 24 #include "llvm/IR/Operator.h" | 24 #include "llvm/IR/Operator.h" |
| 25 #include "llvm/IR/ValueSymbolTable.h" | 25 #include "llvm/IR/ValueSymbolTable.h" |
| 26 #include "llvm/Support/CommandLine.h" | 26 #include "llvm/Support/CommandLine.h" |
| 27 #include "llvm/Support/ErrorHandling.h" | 27 #include "llvm/Support/ErrorHandling.h" |
| 28 #include "llvm/Support/MathExtras.h" | 28 #include "llvm/Support/MathExtras.h" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 56 FUNCTION_INST_RET_VAL_ABBREV, | 56 FUNCTION_INST_RET_VAL_ABBREV, |
| 57 FUNCTION_INST_UNREACHABLE_ABBREV, | 57 FUNCTION_INST_UNREACHABLE_ABBREV, |
| 58 | 58 |
| 59 // SwitchInst Magic | 59 // SwitchInst Magic |
| 60 SWITCH_INST_MAGIC = 0x4B5 // May 2012 => 1205 => Hex | 60 SWITCH_INST_MAGIC = 0x4B5 // May 2012 => 1205 => Hex |
| 61 }; | 61 }; |
| 62 | 62 |
| 63 static unsigned GetEncodedCastOpcode(unsigned Opcode) { | 63 static unsigned GetEncodedCastOpcode(unsigned Opcode) { |
| 64 switch (Opcode) { | 64 switch (Opcode) { |
| 65 default: llvm_unreachable("Unknown cast instruction!"); | 65 default: llvm_unreachable("Unknown cast instruction!"); |
| 66 case Instruction::Trunc : return bitc::CAST_TRUNC; | 66 case Instruction::Trunc : return naclbitc::CAST_TRUNC; |
| 67 case Instruction::ZExt : return bitc::CAST_ZEXT; | 67 case Instruction::ZExt : return naclbitc::CAST_ZEXT; |
| 68 case Instruction::SExt : return bitc::CAST_SEXT; | 68 case Instruction::SExt : return naclbitc::CAST_SEXT; |
| 69 case Instruction::FPToUI : return bitc::CAST_FPTOUI; | 69 case Instruction::FPToUI : return naclbitc::CAST_FPTOUI; |
| 70 case Instruction::FPToSI : return bitc::CAST_FPTOSI; | 70 case Instruction::FPToSI : return naclbitc::CAST_FPTOSI; |
| 71 case Instruction::UIToFP : return bitc::CAST_UITOFP; | 71 case Instruction::UIToFP : return naclbitc::CAST_UITOFP; |
| 72 case Instruction::SIToFP : return bitc::CAST_SITOFP; | 72 case Instruction::SIToFP : return naclbitc::CAST_SITOFP; |
| 73 case Instruction::FPTrunc : return bitc::CAST_FPTRUNC; | 73 case Instruction::FPTrunc : return naclbitc::CAST_FPTRUNC; |
| 74 case Instruction::FPExt : return bitc::CAST_FPEXT; | 74 case Instruction::FPExt : return naclbitc::CAST_FPEXT; |
| 75 case Instruction::PtrToInt: return bitc::CAST_PTRTOINT; | 75 case Instruction::PtrToInt: return naclbitc::CAST_PTRTOINT; |
| 76 case Instruction::IntToPtr: return bitc::CAST_INTTOPTR; | 76 case Instruction::IntToPtr: return naclbitc::CAST_INTTOPTR; |
| 77 case Instruction::BitCast : return bitc::CAST_BITCAST; | 77 case Instruction::BitCast : return naclbitc::CAST_BITCAST; |
| 78 } | 78 } |
| 79 } | 79 } |
| 80 | 80 |
| 81 static unsigned GetEncodedBinaryOpcode(unsigned Opcode) { | 81 static unsigned GetEncodedBinaryOpcode(unsigned Opcode) { |
| 82 switch (Opcode) { | 82 switch (Opcode) { |
| 83 default: llvm_unreachable("Unknown binary instruction!"); | 83 default: llvm_unreachable("Unknown binary instruction!"); |
| 84 case Instruction::Add: | 84 case Instruction::Add: |
| 85 case Instruction::FAdd: return bitc::BINOP_ADD; | 85 case Instruction::FAdd: return naclbitc::BINOP_ADD; |
| 86 case Instruction::Sub: | 86 case Instruction::Sub: |
| 87 case Instruction::FSub: return bitc::BINOP_SUB; | 87 case Instruction::FSub: return naclbitc::BINOP_SUB; |
| 88 case Instruction::Mul: | 88 case Instruction::Mul: |
| 89 case Instruction::FMul: return bitc::BINOP_MUL; | 89 case Instruction::FMul: return naclbitc::BINOP_MUL; |
| 90 case Instruction::UDiv: return bitc::BINOP_UDIV; | 90 case Instruction::UDiv: return naclbitc::BINOP_UDIV; |
| 91 case Instruction::FDiv: | 91 case Instruction::FDiv: |
| 92 case Instruction::SDiv: return bitc::BINOP_SDIV; | 92 case Instruction::SDiv: return naclbitc::BINOP_SDIV; |
| 93 case Instruction::URem: return bitc::BINOP_UREM; | 93 case Instruction::URem: return naclbitc::BINOP_UREM; |
| 94 case Instruction::FRem: | 94 case Instruction::FRem: |
| 95 case Instruction::SRem: return bitc::BINOP_SREM; | 95 case Instruction::SRem: return naclbitc::BINOP_SREM; |
| 96 case Instruction::Shl: return bitc::BINOP_SHL; | 96 case Instruction::Shl: return naclbitc::BINOP_SHL; |
| 97 case Instruction::LShr: return bitc::BINOP_LSHR; | 97 case Instruction::LShr: return naclbitc::BINOP_LSHR; |
| 98 case Instruction::AShr: return bitc::BINOP_ASHR; | 98 case Instruction::AShr: return naclbitc::BINOP_ASHR; |
| 99 case Instruction::And: return bitc::BINOP_AND; | 99 case Instruction::And: return naclbitc::BINOP_AND; |
| 100 case Instruction::Or: return bitc::BINOP_OR; | 100 case Instruction::Or: return naclbitc::BINOP_OR; |
| 101 case Instruction::Xor: return bitc::BINOP_XOR; | 101 case Instruction::Xor: return naclbitc::BINOP_XOR; |
| 102 } | 102 } |
| 103 } | 103 } |
| 104 | 104 |
| 105 static unsigned GetEncodedRMWOperation(AtomicRMWInst::BinOp Op) { | 105 static unsigned GetEncodedRMWOperation(AtomicRMWInst::BinOp Op) { |
| 106 switch (Op) { | 106 switch (Op) { |
| 107 default: llvm_unreachable("Unknown RMW operation!"); | 107 default: llvm_unreachable("Unknown RMW operation!"); |
| 108 case AtomicRMWInst::Xchg: return bitc::RMW_XCHG; | 108 case AtomicRMWInst::Xchg: return naclbitc::RMW_XCHG; |
| 109 case AtomicRMWInst::Add: return bitc::RMW_ADD; | 109 case AtomicRMWInst::Add: return naclbitc::RMW_ADD; |
| 110 case AtomicRMWInst::Sub: return bitc::RMW_SUB; | 110 case AtomicRMWInst::Sub: return naclbitc::RMW_SUB; |
| 111 case AtomicRMWInst::And: return bitc::RMW_AND; | 111 case AtomicRMWInst::And: return naclbitc::RMW_AND; |
| 112 case AtomicRMWInst::Nand: return bitc::RMW_NAND; | 112 case AtomicRMWInst::Nand: return naclbitc::RMW_NAND; |
| 113 case AtomicRMWInst::Or: return bitc::RMW_OR; | 113 case AtomicRMWInst::Or: return naclbitc::RMW_OR; |
| 114 case AtomicRMWInst::Xor: return bitc::RMW_XOR; | 114 case AtomicRMWInst::Xor: return naclbitc::RMW_XOR; |
| 115 case AtomicRMWInst::Max: return bitc::RMW_MAX; | 115 case AtomicRMWInst::Max: return naclbitc::RMW_MAX; |
| 116 case AtomicRMWInst::Min: return bitc::RMW_MIN; | 116 case AtomicRMWInst::Min: return naclbitc::RMW_MIN; |
| 117 case AtomicRMWInst::UMax: return bitc::RMW_UMAX; | 117 case AtomicRMWInst::UMax: return naclbitc::RMW_UMAX; |
| 118 case AtomicRMWInst::UMin: return bitc::RMW_UMIN; | 118 case AtomicRMWInst::UMin: return naclbitc::RMW_UMIN; |
| 119 } | 119 } |
| 120 } | 120 } |
| 121 | 121 |
| 122 static unsigned GetEncodedOrdering(AtomicOrdering Ordering) { | 122 static unsigned GetEncodedOrdering(AtomicOrdering Ordering) { |
| 123 switch (Ordering) { | 123 switch (Ordering) { |
| 124 case NotAtomic: return bitc::ORDERING_NOTATOMIC; | 124 case NotAtomic: return naclbitc::ORDERING_NOTATOMIC; |
| 125 case Unordered: return bitc::ORDERING_UNORDERED; | 125 case Unordered: return naclbitc::ORDERING_UNORDERED; |
| 126 case Monotonic: return bitc::ORDERING_MONOTONIC; | 126 case Monotonic: return naclbitc::ORDERING_MONOTONIC; |
| 127 case Acquire: return bitc::ORDERING_ACQUIRE; | 127 case Acquire: return naclbitc::ORDERING_ACQUIRE; |
| 128 case Release: return bitc::ORDERING_RELEASE; | 128 case Release: return naclbitc::ORDERING_RELEASE; |
| 129 case AcquireRelease: return bitc::ORDERING_ACQREL; | 129 case AcquireRelease: return naclbitc::ORDERING_ACQREL; |
| 130 case SequentiallyConsistent: return bitc::ORDERING_SEQCST; | 130 case SequentiallyConsistent: return naclbitc::ORDERING_SEQCST; |
| 131 } | 131 } |
| 132 llvm_unreachable("Invalid ordering"); | 132 llvm_unreachable("Invalid ordering"); |
| 133 } | 133 } |
| 134 | 134 |
| 135 static unsigned GetEncodedSynchScope(SynchronizationScope SynchScope) { | 135 static unsigned GetEncodedSynchScope(SynchronizationScope SynchScope) { |
| 136 switch (SynchScope) { | 136 switch (SynchScope) { |
| 137 case SingleThread: return bitc::SYNCHSCOPE_SINGLETHREAD; | 137 case SingleThread: return naclbitc::SYNCHSCOPE_SINGLETHREAD; |
| 138 case CrossThread: return bitc::SYNCHSCOPE_CROSSTHREAD; | 138 case CrossThread: return naclbitc::SYNCHSCOPE_CROSSTHREAD; |
| 139 } | 139 } |
| 140 llvm_unreachable("Invalid synch scope"); | 140 llvm_unreachable("Invalid synch scope"); |
| 141 } | 141 } |
| 142 | 142 |
| 143 static void WriteStringRecord(unsigned Code, StringRef Str, | 143 static void WriteStringRecord(unsigned Code, StringRef Str, |
| 144 unsigned AbbrevToUse, NaClBitstreamWriter &Stream)
{ | 144 unsigned AbbrevToUse, NaClBitstreamWriter &Stream)
{ |
| 145 SmallVector<unsigned, 64> Vals; | 145 SmallVector<unsigned, 64> Vals; |
| 146 | 146 |
| 147 // Code: [strchar x N] | 147 // Code: [strchar x N] |
| 148 for (unsigned i = 0, e = Str.size(); i != e; ++i) { | 148 for (unsigned i = 0, e = Str.size(); i != e; ++i) { |
| 149 if (AbbrevToUse && !BitCodeAbbrevOp::isChar6(Str[i])) | 149 if (AbbrevToUse && !BitCodeAbbrevOp::isChar6(Str[i])) |
| 150 AbbrevToUse = 0; | 150 AbbrevToUse = 0; |
| 151 Vals.push_back(Str[i]); | 151 Vals.push_back(Str[i]); |
| 152 } | 152 } |
| 153 | 153 |
| 154 // Emit the finished record. | 154 // Emit the finished record. |
| 155 Stream.EmitRecord(Code, Vals, AbbrevToUse); | 155 Stream.EmitRecord(Code, Vals, AbbrevToUse); |
| 156 } | 156 } |
| 157 | 157 |
| 158 static void WriteAttributeGroupTable(const NaClValueEnumerator &VE, | 158 static void WriteAttributeGroupTable(const NaClValueEnumerator &VE, |
| 159 NaClBitstreamWriter &Stream) { | 159 NaClBitstreamWriter &Stream) { |
| 160 const std::vector<AttributeSet> &AttrGrps = VE.getAttributeGroups(); | 160 const std::vector<AttributeSet> &AttrGrps = VE.getAttributeGroups(); |
| 161 if (AttrGrps.empty()) return; | 161 if (AttrGrps.empty()) return; |
| 162 | 162 |
| 163 Stream.EnterSubblock(bitc::PARAMATTR_GROUP_BLOCK_ID, 3); | 163 Stream.EnterSubblock(naclbitc::PARAMATTR_GROUP_BLOCK_ID, 3); |
| 164 | 164 |
| 165 SmallVector<uint64_t, 64> Record; | 165 SmallVector<uint64_t, 64> Record; |
| 166 for (unsigned i = 0, e = AttrGrps.size(); i != e; ++i) { | 166 for (unsigned i = 0, e = AttrGrps.size(); i != e; ++i) { |
| 167 AttributeSet AS = AttrGrps[i]; | 167 AttributeSet AS = AttrGrps[i]; |
| 168 for (unsigned i = 0, e = AS.getNumSlots(); i != e; ++i) { | 168 for (unsigned i = 0, e = AS.getNumSlots(); i != e; ++i) { |
| 169 AttributeSet A = AS.getSlotAttributes(i); | 169 AttributeSet A = AS.getSlotAttributes(i); |
| 170 | 170 |
| 171 Record.push_back(VE.getAttributeGroupID(A)); | 171 Record.push_back(VE.getAttributeGroupID(A)); |
| 172 Record.push_back(AS.getSlotIndex(i)); | 172 Record.push_back(AS.getSlotIndex(i)); |
| 173 | 173 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 188 Record.push_back(Val.empty() ? 3 : 4); | 188 Record.push_back(Val.empty() ? 3 : 4); |
| 189 Record.append(Kind.begin(), Kind.end()); | 189 Record.append(Kind.begin(), Kind.end()); |
| 190 Record.push_back(0); | 190 Record.push_back(0); |
| 191 if (!Val.empty()) { | 191 if (!Val.empty()) { |
| 192 Record.append(Val.begin(), Val.end()); | 192 Record.append(Val.begin(), Val.end()); |
| 193 Record.push_back(0); | 193 Record.push_back(0); |
| 194 } | 194 } |
| 195 } | 195 } |
| 196 } | 196 } |
| 197 | 197 |
| 198 Stream.EmitRecord(bitc::PARAMATTR_GRP_CODE_ENTRY, Record); | 198 Stream.EmitRecord(naclbitc::PARAMATTR_GRP_CODE_ENTRY, Record); |
| 199 Record.clear(); | 199 Record.clear(); |
| 200 } | 200 } |
| 201 } | 201 } |
| 202 | 202 |
| 203 Stream.ExitBlock(); | 203 Stream.ExitBlock(); |
| 204 } | 204 } |
| 205 | 205 |
| 206 static void WriteAttributeTable(const NaClValueEnumerator &VE, | 206 static void WriteAttributeTable(const NaClValueEnumerator &VE, |
| 207 NaClBitstreamWriter &Stream) { | 207 NaClBitstreamWriter &Stream) { |
| 208 const std::vector<AttributeSet> &Attrs = VE.getAttributes(); | 208 const std::vector<AttributeSet> &Attrs = VE.getAttributes(); |
| 209 if (Attrs.empty()) return; | 209 if (Attrs.empty()) return; |
| 210 | 210 |
| 211 Stream.EnterSubblock(bitc::PARAMATTR_BLOCK_ID, 3); | 211 Stream.EnterSubblock(naclbitc::PARAMATTR_BLOCK_ID, 3); |
| 212 | 212 |
| 213 SmallVector<uint64_t, 64> Record; | 213 SmallVector<uint64_t, 64> Record; |
| 214 for (unsigned i = 0, e = Attrs.size(); i != e; ++i) { | 214 for (unsigned i = 0, e = Attrs.size(); i != e; ++i) { |
| 215 const AttributeSet &A = Attrs[i]; | 215 const AttributeSet &A = Attrs[i]; |
| 216 for (unsigned i = 0, e = A.getNumSlots(); i != e; ++i) | 216 for (unsigned i = 0, e = A.getNumSlots(); i != e; ++i) |
| 217 Record.push_back(VE.getAttributeGroupID(A.getSlotAttributes(i))); | 217 Record.push_back(VE.getAttributeGroupID(A.getSlotAttributes(i))); |
| 218 | 218 |
| 219 Stream.EmitRecord(bitc::PARAMATTR_CODE_ENTRY, Record); | 219 Stream.EmitRecord(naclbitc::PARAMATTR_CODE_ENTRY, Record); |
| 220 Record.clear(); | 220 Record.clear(); |
| 221 } | 221 } |
| 222 | 222 |
| 223 Stream.ExitBlock(); | 223 Stream.ExitBlock(); |
| 224 } | 224 } |
| 225 | 225 |
| 226 /// WriteTypeTable - Write out the type table for a module. | 226 /// WriteTypeTable - Write out the type table for a module. |
| 227 static void WriteTypeTable(const NaClValueEnumerator &VE, | 227 static void WriteTypeTable(const NaClValueEnumerator &VE, |
| 228 NaClBitstreamWriter &Stream) { | 228 NaClBitstreamWriter &Stream) { |
| 229 const NaClValueEnumerator::TypeList &TypeList = VE.getTypes(); | 229 const NaClValueEnumerator::TypeList &TypeList = VE.getTypes(); |
| 230 | 230 |
| 231 Stream.EnterSubblock(bitc::TYPE_BLOCK_ID_NEW, 4 /*count from # abbrevs */); | 231 Stream.EnterSubblock(naclbitc::TYPE_BLOCK_ID_NEW, 4 /*count from # abbrevs */)
; |
| 232 SmallVector<uint64_t, 64> TypeVals; | 232 SmallVector<uint64_t, 64> TypeVals; |
| 233 | 233 |
| 234 uint64_t NumBits = Log2_32_Ceil(VE.getTypes().size()+1); | 234 uint64_t NumBits = Log2_32_Ceil(VE.getTypes().size()+1); |
| 235 | 235 |
| 236 // Abbrev for TYPE_CODE_POINTER. | 236 // Abbrev for TYPE_CODE_POINTER. |
| 237 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 237 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 238 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_POINTER)); | 238 Abbv->Add(BitCodeAbbrevOp(naclbitc::TYPE_CODE_POINTER)); |
| 239 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); | 239 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); |
| 240 Abbv->Add(BitCodeAbbrevOp(0)); // Addrspace = 0 | 240 Abbv->Add(BitCodeAbbrevOp(0)); // Addrspace = 0 |
| 241 unsigned PtrAbbrev = Stream.EmitAbbrev(Abbv); | 241 unsigned PtrAbbrev = Stream.EmitAbbrev(Abbv); |
| 242 | 242 |
| 243 // Abbrev for TYPE_CODE_FUNCTION. | 243 // Abbrev for TYPE_CODE_FUNCTION. |
| 244 Abbv = new BitCodeAbbrev(); | 244 Abbv = new BitCodeAbbrev(); |
| 245 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_FUNCTION)); | 245 Abbv->Add(BitCodeAbbrevOp(naclbitc::TYPE_CODE_FUNCTION)); |
| 246 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isvararg | 246 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isvararg |
| 247 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); | 247 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); |
| 248 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); | 248 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); |
| 249 | 249 |
| 250 unsigned FunctionAbbrev = Stream.EmitAbbrev(Abbv); | 250 unsigned FunctionAbbrev = Stream.EmitAbbrev(Abbv); |
| 251 | 251 |
| 252 // Abbrev for TYPE_CODE_STRUCT_ANON. | 252 // Abbrev for TYPE_CODE_STRUCT_ANON. |
| 253 Abbv = new BitCodeAbbrev(); | 253 Abbv = new BitCodeAbbrev(); |
| 254 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_ANON)); | 254 Abbv->Add(BitCodeAbbrevOp(naclbitc::TYPE_CODE_STRUCT_ANON)); |
| 255 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked | 255 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked |
| 256 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); | 256 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); |
| 257 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); | 257 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); |
| 258 | 258 |
| 259 unsigned StructAnonAbbrev = Stream.EmitAbbrev(Abbv); | 259 unsigned StructAnonAbbrev = Stream.EmitAbbrev(Abbv); |
| 260 | 260 |
| 261 // Abbrev for TYPE_CODE_STRUCT_NAME. | 261 // Abbrev for TYPE_CODE_STRUCT_NAME. |
| 262 Abbv = new BitCodeAbbrev(); | 262 Abbv = new BitCodeAbbrev(); |
| 263 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAME)); | 263 Abbv->Add(BitCodeAbbrevOp(naclbitc::TYPE_CODE_STRUCT_NAME)); |
| 264 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); | 264 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); |
| 265 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); | 265 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); |
| 266 unsigned StructNameAbbrev = Stream.EmitAbbrev(Abbv); | 266 unsigned StructNameAbbrev = Stream.EmitAbbrev(Abbv); |
| 267 | 267 |
| 268 // Abbrev for TYPE_CODE_STRUCT_NAMED. | 268 // Abbrev for TYPE_CODE_STRUCT_NAMED. |
| 269 Abbv = new BitCodeAbbrev(); | 269 Abbv = new BitCodeAbbrev(); |
| 270 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAMED)); | 270 Abbv->Add(BitCodeAbbrevOp(naclbitc::TYPE_CODE_STRUCT_NAMED)); |
| 271 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked | 271 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked |
| 272 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); | 272 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); |
| 273 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); | 273 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); |
| 274 | 274 |
| 275 unsigned StructNamedAbbrev = Stream.EmitAbbrev(Abbv); | 275 unsigned StructNamedAbbrev = Stream.EmitAbbrev(Abbv); |
| 276 | 276 |
| 277 // Abbrev for TYPE_CODE_ARRAY. | 277 // Abbrev for TYPE_CODE_ARRAY. |
| 278 Abbv = new BitCodeAbbrev(); | 278 Abbv = new BitCodeAbbrev(); |
| 279 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_ARRAY)); | 279 Abbv->Add(BitCodeAbbrevOp(naclbitc::TYPE_CODE_ARRAY)); |
| 280 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // size | 280 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // size |
| 281 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); | 281 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); |
| 282 | 282 |
| 283 unsigned ArrayAbbrev = Stream.EmitAbbrev(Abbv); | 283 unsigned ArrayAbbrev = Stream.EmitAbbrev(Abbv); |
| 284 | 284 |
| 285 // Emit an entry count so the reader can reserve space. | 285 // Emit an entry count so the reader can reserve space. |
| 286 TypeVals.push_back(TypeList.size()); | 286 TypeVals.push_back(TypeList.size()); |
| 287 Stream.EmitRecord(bitc::TYPE_CODE_NUMENTRY, TypeVals); | 287 Stream.EmitRecord(naclbitc::TYPE_CODE_NUMENTRY, TypeVals); |
| 288 TypeVals.clear(); | 288 TypeVals.clear(); |
| 289 | 289 |
| 290 // Loop over all of the types, emitting each in turn. | 290 // Loop over all of the types, emitting each in turn. |
| 291 for (unsigned i = 0, e = TypeList.size(); i != e; ++i) { | 291 for (unsigned i = 0, e = TypeList.size(); i != e; ++i) { |
| 292 Type *T = TypeList[i]; | 292 Type *T = TypeList[i]; |
| 293 int AbbrevToUse = 0; | 293 int AbbrevToUse = 0; |
| 294 unsigned Code = 0; | 294 unsigned Code = 0; |
| 295 | 295 |
| 296 switch (T->getTypeID()) { | 296 switch (T->getTypeID()) { |
| 297 default: llvm_unreachable("Unknown type!"); | 297 default: llvm_unreachable("Unknown type!"); |
| 298 case Type::VoidTyID: Code = bitc::TYPE_CODE_VOID; break; | 298 case Type::VoidTyID: Code = naclbitc::TYPE_CODE_VOID; break; |
| 299 case Type::HalfTyID: Code = bitc::TYPE_CODE_HALF; break; | 299 case Type::HalfTyID: Code = naclbitc::TYPE_CODE_HALF; break; |
| 300 case Type::FloatTyID: Code = bitc::TYPE_CODE_FLOAT; break; | 300 case Type::FloatTyID: Code = naclbitc::TYPE_CODE_FLOAT; break; |
| 301 case Type::DoubleTyID: Code = bitc::TYPE_CODE_DOUBLE; break; | 301 case Type::DoubleTyID: Code = naclbitc::TYPE_CODE_DOUBLE; break; |
| 302 case Type::X86_FP80TyID: Code = bitc::TYPE_CODE_X86_FP80; break; | 302 case Type::X86_FP80TyID: Code = naclbitc::TYPE_CODE_X86_FP80; break; |
| 303 case Type::FP128TyID: Code = bitc::TYPE_CODE_FP128; break; | 303 case Type::FP128TyID: Code = naclbitc::TYPE_CODE_FP128; break; |
| 304 case Type::PPC_FP128TyID: Code = bitc::TYPE_CODE_PPC_FP128; break; | 304 case Type::PPC_FP128TyID: Code = naclbitc::TYPE_CODE_PPC_FP128; break; |
| 305 case Type::LabelTyID: Code = bitc::TYPE_CODE_LABEL; break; | 305 case Type::LabelTyID: Code = naclbitc::TYPE_CODE_LABEL; break; |
| 306 case Type::MetadataTyID: Code = bitc::TYPE_CODE_METADATA; break; | 306 case Type::MetadataTyID: Code = naclbitc::TYPE_CODE_METADATA; break; |
| 307 case Type::X86_MMXTyID: Code = bitc::TYPE_CODE_X86_MMX; break; | 307 case Type::X86_MMXTyID: Code = naclbitc::TYPE_CODE_X86_MMX; break; |
| 308 case Type::IntegerTyID: | 308 case Type::IntegerTyID: |
| 309 // INTEGER: [width] | 309 // INTEGER: [width] |
| 310 Code = bitc::TYPE_CODE_INTEGER; | 310 Code = naclbitc::TYPE_CODE_INTEGER; |
| 311 TypeVals.push_back(cast<IntegerType>(T)->getBitWidth()); | 311 TypeVals.push_back(cast<IntegerType>(T)->getBitWidth()); |
| 312 break; | 312 break; |
| 313 case Type::PointerTyID: { | 313 case Type::PointerTyID: { |
| 314 PointerType *PTy = cast<PointerType>(T); | 314 PointerType *PTy = cast<PointerType>(T); |
| 315 // POINTER: [pointee type, address space] | 315 // POINTER: [pointee type, address space] |
| 316 Code = bitc::TYPE_CODE_POINTER; | 316 Code = naclbitc::TYPE_CODE_POINTER; |
| 317 TypeVals.push_back(VE.getTypeID(PTy->getElementType())); | 317 TypeVals.push_back(VE.getTypeID(PTy->getElementType())); |
| 318 unsigned AddressSpace = PTy->getAddressSpace(); | 318 unsigned AddressSpace = PTy->getAddressSpace(); |
| 319 TypeVals.push_back(AddressSpace); | 319 TypeVals.push_back(AddressSpace); |
| 320 if (AddressSpace == 0) AbbrevToUse = PtrAbbrev; | 320 if (AddressSpace == 0) AbbrevToUse = PtrAbbrev; |
| 321 break; | 321 break; |
| 322 } | 322 } |
| 323 case Type::FunctionTyID: { | 323 case Type::FunctionTyID: { |
| 324 FunctionType *FT = cast<FunctionType>(T); | 324 FunctionType *FT = cast<FunctionType>(T); |
| 325 // FUNCTION: [isvararg, retty, paramty x N] | 325 // FUNCTION: [isvararg, retty, paramty x N] |
| 326 Code = bitc::TYPE_CODE_FUNCTION; | 326 Code = naclbitc::TYPE_CODE_FUNCTION; |
| 327 TypeVals.push_back(FT->isVarArg()); | 327 TypeVals.push_back(FT->isVarArg()); |
| 328 TypeVals.push_back(VE.getTypeID(FT->getReturnType())); | 328 TypeVals.push_back(VE.getTypeID(FT->getReturnType())); |
| 329 for (unsigned i = 0, e = FT->getNumParams(); i != e; ++i) | 329 for (unsigned i = 0, e = FT->getNumParams(); i != e; ++i) |
| 330 TypeVals.push_back(VE.getTypeID(FT->getParamType(i))); | 330 TypeVals.push_back(VE.getTypeID(FT->getParamType(i))); |
| 331 AbbrevToUse = FunctionAbbrev; | 331 AbbrevToUse = FunctionAbbrev; |
| 332 break; | 332 break; |
| 333 } | 333 } |
| 334 case Type::StructTyID: { | 334 case Type::StructTyID: { |
| 335 StructType *ST = cast<StructType>(T); | 335 StructType *ST = cast<StructType>(T); |
| 336 // STRUCT: [ispacked, eltty x N] | 336 // STRUCT: [ispacked, eltty x N] |
| 337 TypeVals.push_back(ST->isPacked()); | 337 TypeVals.push_back(ST->isPacked()); |
| 338 // Output all of the element types. | 338 // Output all of the element types. |
| 339 for (StructType::element_iterator I = ST->element_begin(), | 339 for (StructType::element_iterator I = ST->element_begin(), |
| 340 E = ST->element_end(); I != E; ++I) | 340 E = ST->element_end(); I != E; ++I) |
| 341 TypeVals.push_back(VE.getTypeID(*I)); | 341 TypeVals.push_back(VE.getTypeID(*I)); |
| 342 | 342 |
| 343 if (ST->isLiteral()) { | 343 if (ST->isLiteral()) { |
| 344 Code = bitc::TYPE_CODE_STRUCT_ANON; | 344 Code = naclbitc::TYPE_CODE_STRUCT_ANON; |
| 345 AbbrevToUse = StructAnonAbbrev; | 345 AbbrevToUse = StructAnonAbbrev; |
| 346 } else { | 346 } else { |
| 347 if (ST->isOpaque()) { | 347 if (ST->isOpaque()) { |
| 348 Code = bitc::TYPE_CODE_OPAQUE; | 348 Code = naclbitc::TYPE_CODE_OPAQUE; |
| 349 } else { | 349 } else { |
| 350 Code = bitc::TYPE_CODE_STRUCT_NAMED; | 350 Code = naclbitc::TYPE_CODE_STRUCT_NAMED; |
| 351 AbbrevToUse = StructNamedAbbrev; | 351 AbbrevToUse = StructNamedAbbrev; |
| 352 } | 352 } |
| 353 | 353 |
| 354 // Emit the name if it is present. | 354 // Emit the name if it is present. |
| 355 if (!ST->getName().empty()) | 355 if (!ST->getName().empty()) |
| 356 WriteStringRecord(bitc::TYPE_CODE_STRUCT_NAME, ST->getName(), | 356 WriteStringRecord(naclbitc::TYPE_CODE_STRUCT_NAME, ST->getName(), |
| 357 StructNameAbbrev, Stream); | 357 StructNameAbbrev, Stream); |
| 358 } | 358 } |
| 359 break; | 359 break; |
| 360 } | 360 } |
| 361 case Type::ArrayTyID: { | 361 case Type::ArrayTyID: { |
| 362 ArrayType *AT = cast<ArrayType>(T); | 362 ArrayType *AT = cast<ArrayType>(T); |
| 363 // ARRAY: [numelts, eltty] | 363 // ARRAY: [numelts, eltty] |
| 364 Code = bitc::TYPE_CODE_ARRAY; | 364 Code = naclbitc::TYPE_CODE_ARRAY; |
| 365 TypeVals.push_back(AT->getNumElements()); | 365 TypeVals.push_back(AT->getNumElements()); |
| 366 TypeVals.push_back(VE.getTypeID(AT->getElementType())); | 366 TypeVals.push_back(VE.getTypeID(AT->getElementType())); |
| 367 AbbrevToUse = ArrayAbbrev; | 367 AbbrevToUse = ArrayAbbrev; |
| 368 break; | 368 break; |
| 369 } | 369 } |
| 370 case Type::VectorTyID: { | 370 case Type::VectorTyID: { |
| 371 VectorType *VT = cast<VectorType>(T); | 371 VectorType *VT = cast<VectorType>(T); |
| 372 // VECTOR [numelts, eltty] | 372 // VECTOR [numelts, eltty] |
| 373 Code = bitc::TYPE_CODE_VECTOR; | 373 Code = naclbitc::TYPE_CODE_VECTOR; |
| 374 TypeVals.push_back(VT->getNumElements()); | 374 TypeVals.push_back(VT->getNumElements()); |
| 375 TypeVals.push_back(VE.getTypeID(VT->getElementType())); | 375 TypeVals.push_back(VE.getTypeID(VT->getElementType())); |
| 376 break; | 376 break; |
| 377 } | 377 } |
| 378 } | 378 } |
| 379 | 379 |
| 380 // Emit the finished record. | 380 // Emit the finished record. |
| 381 Stream.EmitRecord(Code, TypeVals, AbbrevToUse); | 381 Stream.EmitRecord(Code, TypeVals, AbbrevToUse); |
| 382 TypeVals.clear(); | 382 TypeVals.clear(); |
| 383 } | 383 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 426 } | 426 } |
| 427 llvm_unreachable("Invalid TLS model"); | 427 llvm_unreachable("Invalid TLS model"); |
| 428 } | 428 } |
| 429 | 429 |
| 430 // Emit top-level description of module, including target triple, inline asm, | 430 // Emit top-level description of module, including target triple, inline asm, |
| 431 // descriptors for global variables, and function prototype info. | 431 // descriptors for global variables, and function prototype info. |
| 432 static void WriteModuleInfo(const Module *M, const NaClValueEnumerator &VE, | 432 static void WriteModuleInfo(const Module *M, const NaClValueEnumerator &VE, |
| 433 NaClBitstreamWriter &Stream) { | 433 NaClBitstreamWriter &Stream) { |
| 434 // Emit various pieces of data attached to a module. | 434 // Emit various pieces of data attached to a module. |
| 435 if (!M->getTargetTriple().empty()) | 435 if (!M->getTargetTriple().empty()) |
| 436 WriteStringRecord(bitc::MODULE_CODE_TRIPLE, M->getTargetTriple(), | 436 WriteStringRecord(naclbitc::MODULE_CODE_TRIPLE, M->getTargetTriple(), |
| 437 0/*TODO*/, Stream); | 437 0/*TODO*/, Stream); |
| 438 if (!M->getDataLayout().empty()) | 438 if (!M->getDataLayout().empty()) |
| 439 WriteStringRecord(bitc::MODULE_CODE_DATALAYOUT, M->getDataLayout(), | 439 WriteStringRecord(naclbitc::MODULE_CODE_DATALAYOUT, M->getDataLayout(), |
| 440 0/*TODO*/, Stream); | 440 0/*TODO*/, Stream); |
| 441 if (!M->getModuleInlineAsm().empty()) | 441 if (!M->getModuleInlineAsm().empty()) |
| 442 WriteStringRecord(bitc::MODULE_CODE_ASM, M->getModuleInlineAsm(), | 442 WriteStringRecord(naclbitc::MODULE_CODE_ASM, M->getModuleInlineAsm(), |
| 443 0/*TODO*/, Stream); | 443 0/*TODO*/, Stream); |
| 444 | 444 |
| 445 // Emit information about sections and GC, computing how many there are. Also | 445 // Emit information about sections and GC, computing how many there are. Also |
| 446 // compute the maximum alignment value. | 446 // compute the maximum alignment value. |
| 447 std::map<std::string, unsigned> SectionMap; | 447 std::map<std::string, unsigned> SectionMap; |
| 448 std::map<std::string, unsigned> GCMap; | 448 std::map<std::string, unsigned> GCMap; |
| 449 unsigned MaxAlignment = 0; | 449 unsigned MaxAlignment = 0; |
| 450 unsigned MaxGlobalType = 0; | 450 unsigned MaxGlobalType = 0; |
| 451 for (Module::const_global_iterator GV = M->global_begin(),E = M->global_end(); | 451 for (Module::const_global_iterator GV = M->global_begin(),E = M->global_end(); |
| 452 GV != E; ++GV) { | 452 GV != E; ++GV) { |
| 453 MaxAlignment = std::max(MaxAlignment, GV->getAlignment()); | 453 MaxAlignment = std::max(MaxAlignment, GV->getAlignment()); |
| 454 MaxGlobalType = std::max(MaxGlobalType, VE.getTypeID(GV->getType())); | 454 MaxGlobalType = std::max(MaxGlobalType, VE.getTypeID(GV->getType())); |
| 455 if (GV->hasSection()) { | 455 if (GV->hasSection()) { |
| 456 // Give section names unique ID's. | 456 // Give section names unique ID's. |
| 457 unsigned &Entry = SectionMap[GV->getSection()]; | 457 unsigned &Entry = SectionMap[GV->getSection()]; |
| 458 if (!Entry) { | 458 if (!Entry) { |
| 459 WriteStringRecord(bitc::MODULE_CODE_SECTIONNAME, GV->getSection(), | 459 WriteStringRecord(naclbitc::MODULE_CODE_SECTIONNAME, GV->getSection(), |
| 460 0/*TODO*/, Stream); | 460 0/*TODO*/, Stream); |
| 461 Entry = SectionMap.size(); | 461 Entry = SectionMap.size(); |
| 462 } | 462 } |
| 463 } | 463 } |
| 464 } | 464 } |
| 465 for (Module::const_iterator F = M->begin(), E = M->end(); F != E; ++F) { | 465 for (Module::const_iterator F = M->begin(), E = M->end(); F != E; ++F) { |
| 466 MaxAlignment = std::max(MaxAlignment, F->getAlignment()); | 466 MaxAlignment = std::max(MaxAlignment, F->getAlignment()); |
| 467 if (F->hasSection()) { | 467 if (F->hasSection()) { |
| 468 // Give section names unique ID's. | 468 // Give section names unique ID's. |
| 469 unsigned &Entry = SectionMap[F->getSection()]; | 469 unsigned &Entry = SectionMap[F->getSection()]; |
| 470 if (!Entry) { | 470 if (!Entry) { |
| 471 WriteStringRecord(bitc::MODULE_CODE_SECTIONNAME, F->getSection(), | 471 WriteStringRecord(naclbitc::MODULE_CODE_SECTIONNAME, F->getSection(), |
| 472 0/*TODO*/, Stream); | 472 0/*TODO*/, Stream); |
| 473 Entry = SectionMap.size(); | 473 Entry = SectionMap.size(); |
| 474 } | 474 } |
| 475 } | 475 } |
| 476 if (F->hasGC()) { | 476 if (F->hasGC()) { |
| 477 // Same for GC names. | 477 // Same for GC names. |
| 478 unsigned &Entry = GCMap[F->getGC()]; | 478 unsigned &Entry = GCMap[F->getGC()]; |
| 479 if (!Entry) { | 479 if (!Entry) { |
| 480 WriteStringRecord(bitc::MODULE_CODE_GCNAME, F->getGC(), | 480 WriteStringRecord(naclbitc::MODULE_CODE_GCNAME, F->getGC(), |
| 481 0/*TODO*/, Stream); | 481 0/*TODO*/, Stream); |
| 482 Entry = GCMap.size(); | 482 Entry = GCMap.size(); |
| 483 } | 483 } |
| 484 } | 484 } |
| 485 } | 485 } |
| 486 | 486 |
| 487 // Emit abbrev for globals, now that we know # sections and max alignment. | 487 // Emit abbrev for globals, now that we know # sections and max alignment. |
| 488 unsigned SimpleGVarAbbrev = 0; | 488 unsigned SimpleGVarAbbrev = 0; |
| 489 if (!M->global_empty()) { | 489 if (!M->global_empty()) { |
| 490 // Add an abbrev for common globals with no visibility or thread localness. | 490 // Add an abbrev for common globals with no visibility or thread localness. |
| 491 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 491 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 492 Abbv->Add(BitCodeAbbrevOp(bitc::MODULE_CODE_GLOBALVAR)); | 492 Abbv->Add(BitCodeAbbrevOp(naclbitc::MODULE_CODE_GLOBALVAR)); |
| 493 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, | 493 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, |
| 494 Log2_32_Ceil(MaxGlobalType+1))); | 494 Log2_32_Ceil(MaxGlobalType+1))); |
| 495 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Constant. | 495 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Constant. |
| 496 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Initializer. | 496 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Initializer. |
| 497 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // Linkage. | 497 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // Linkage. |
| 498 if (MaxAlignment == 0) // Alignment. | 498 if (MaxAlignment == 0) // Alignment. |
| 499 Abbv->Add(BitCodeAbbrevOp(0)); | 499 Abbv->Add(BitCodeAbbrevOp(0)); |
| 500 else { | 500 else { |
| 501 unsigned MaxEncAlignment = Log2_32(MaxAlignment)+1; | 501 unsigned MaxEncAlignment = Log2_32(MaxAlignment)+1; |
| 502 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, | 502 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, |
| (...skipping 28 matching lines...) Expand all Loading... |
| 531 GV->getVisibility() != GlobalValue::DefaultVisibility || | 531 GV->getVisibility() != GlobalValue::DefaultVisibility || |
| 532 GV->hasUnnamedAddr() || GV->isExternallyInitialized()) { | 532 GV->hasUnnamedAddr() || GV->isExternallyInitialized()) { |
| 533 Vals.push_back(getEncodedVisibility(GV)); | 533 Vals.push_back(getEncodedVisibility(GV)); |
| 534 Vals.push_back(getEncodedThreadLocalMode(GV)); | 534 Vals.push_back(getEncodedThreadLocalMode(GV)); |
| 535 Vals.push_back(GV->hasUnnamedAddr()); | 535 Vals.push_back(GV->hasUnnamedAddr()); |
| 536 Vals.push_back(GV->isExternallyInitialized()); | 536 Vals.push_back(GV->isExternallyInitialized()); |
| 537 } else { | 537 } else { |
| 538 AbbrevToUse = SimpleGVarAbbrev; | 538 AbbrevToUse = SimpleGVarAbbrev; |
| 539 } | 539 } |
| 540 | 540 |
| 541 Stream.EmitRecord(bitc::MODULE_CODE_GLOBALVAR, Vals, AbbrevToUse); | 541 Stream.EmitRecord(naclbitc::MODULE_CODE_GLOBALVAR, Vals, AbbrevToUse); |
| 542 Vals.clear(); | 542 Vals.clear(); |
| 543 } | 543 } |
| 544 | 544 |
| 545 // Emit the function proto information. | 545 // Emit the function proto information. |
| 546 for (Module::const_iterator F = M->begin(), E = M->end(); F != E; ++F) { | 546 for (Module::const_iterator F = M->begin(), E = M->end(); F != E; ++F) { |
| 547 // FUNCTION: [type, callingconv, isproto, linkage, paramattrs, alignment, | 547 // FUNCTION: [type, callingconv, isproto, linkage, paramattrs, alignment, |
| 548 // section, visibility, gc, unnamed_addr] | 548 // section, visibility, gc, unnamed_addr] |
| 549 Vals.push_back(VE.getTypeID(F->getType())); | 549 Vals.push_back(VE.getTypeID(F->getType())); |
| 550 Vals.push_back(F->getCallingConv()); | 550 Vals.push_back(F->getCallingConv()); |
| 551 Vals.push_back(F->isDeclaration()); | 551 Vals.push_back(F->isDeclaration()); |
| 552 Vals.push_back(getEncodedLinkage(F)); | 552 Vals.push_back(getEncodedLinkage(F)); |
| 553 Vals.push_back(VE.getAttributeID(F->getAttributes())); | 553 Vals.push_back(VE.getAttributeID(F->getAttributes())); |
| 554 Vals.push_back(Log2_32(F->getAlignment())+1); | 554 Vals.push_back(Log2_32(F->getAlignment())+1); |
| 555 Vals.push_back(F->hasSection() ? SectionMap[F->getSection()] : 0); | 555 Vals.push_back(F->hasSection() ? SectionMap[F->getSection()] : 0); |
| 556 Vals.push_back(getEncodedVisibility(F)); | 556 Vals.push_back(getEncodedVisibility(F)); |
| 557 Vals.push_back(F->hasGC() ? GCMap[F->getGC()] : 0); | 557 Vals.push_back(F->hasGC() ? GCMap[F->getGC()] : 0); |
| 558 Vals.push_back(F->hasUnnamedAddr()); | 558 Vals.push_back(F->hasUnnamedAddr()); |
| 559 | 559 |
| 560 unsigned AbbrevToUse = 0; | 560 unsigned AbbrevToUse = 0; |
| 561 Stream.EmitRecord(bitc::MODULE_CODE_FUNCTION, Vals, AbbrevToUse); | 561 Stream.EmitRecord(naclbitc::MODULE_CODE_FUNCTION, Vals, AbbrevToUse); |
| 562 Vals.clear(); | 562 Vals.clear(); |
| 563 } | 563 } |
| 564 | 564 |
| 565 // Emit the alias information. | 565 // Emit the alias information. |
| 566 for (Module::const_alias_iterator AI = M->alias_begin(), E = M->alias_end(); | 566 for (Module::const_alias_iterator AI = M->alias_begin(), E = M->alias_end(); |
| 567 AI != E; ++AI) { | 567 AI != E; ++AI) { |
| 568 // ALIAS: [alias type, aliasee val#, linkage, visibility] | 568 // ALIAS: [alias type, aliasee val#, linkage, visibility] |
| 569 Vals.push_back(VE.getTypeID(AI->getType())); | 569 Vals.push_back(VE.getTypeID(AI->getType())); |
| 570 Vals.push_back(VE.getValueID(AI->getAliasee())); | 570 Vals.push_back(VE.getValueID(AI->getAliasee())); |
| 571 Vals.push_back(getEncodedLinkage(AI)); | 571 Vals.push_back(getEncodedLinkage(AI)); |
| 572 Vals.push_back(getEncodedVisibility(AI)); | 572 Vals.push_back(getEncodedVisibility(AI)); |
| 573 unsigned AbbrevToUse = 0; | 573 unsigned AbbrevToUse = 0; |
| 574 Stream.EmitRecord(bitc::MODULE_CODE_ALIAS, Vals, AbbrevToUse); | 574 Stream.EmitRecord(naclbitc::MODULE_CODE_ALIAS, Vals, AbbrevToUse); |
| 575 Vals.clear(); | 575 Vals.clear(); |
| 576 } | 576 } |
| 577 } | 577 } |
| 578 | 578 |
| 579 static uint64_t GetOptimizationFlags(const Value *V) { | 579 static uint64_t GetOptimizationFlags(const Value *V) { |
| 580 uint64_t Flags = 0; | 580 uint64_t Flags = 0; |
| 581 | 581 |
| 582 if (const OverflowingBinaryOperator *OBO = | 582 if (const OverflowingBinaryOperator *OBO = |
| 583 dyn_cast<OverflowingBinaryOperator>(V)) { | 583 dyn_cast<OverflowingBinaryOperator>(V)) { |
| 584 if (OBO->hasNoSignedWrap()) | 584 if (OBO->hasNoSignedWrap()) |
| 585 Flags |= 1 << bitc::OBO_NO_SIGNED_WRAP; | 585 Flags |= 1 << naclbitc::OBO_NO_SIGNED_WRAP; |
| 586 if (OBO->hasNoUnsignedWrap()) | 586 if (OBO->hasNoUnsignedWrap()) |
| 587 Flags |= 1 << bitc::OBO_NO_UNSIGNED_WRAP; | 587 Flags |= 1 << naclbitc::OBO_NO_UNSIGNED_WRAP; |
| 588 } else if (const PossiblyExactOperator *PEO = | 588 } else if (const PossiblyExactOperator *PEO = |
| 589 dyn_cast<PossiblyExactOperator>(V)) { | 589 dyn_cast<PossiblyExactOperator>(V)) { |
| 590 if (PEO->isExact()) | 590 if (PEO->isExact()) |
| 591 Flags |= 1 << bitc::PEO_EXACT; | 591 Flags |= 1 << naclbitc::PEO_EXACT; |
| 592 } else if (const FPMathOperator *FPMO = | 592 } else if (const FPMathOperator *FPMO = |
| 593 dyn_cast<const FPMathOperator>(V)) { | 593 dyn_cast<const FPMathOperator>(V)) { |
| 594 if (FPMO->hasUnsafeAlgebra()) | 594 if (FPMO->hasUnsafeAlgebra()) |
| 595 Flags |= FastMathFlags::UnsafeAlgebra; | 595 Flags |= FastMathFlags::UnsafeAlgebra; |
| 596 if (FPMO->hasNoNaNs()) | 596 if (FPMO->hasNoNaNs()) |
| 597 Flags |= FastMathFlags::NoNaNs; | 597 Flags |= FastMathFlags::NoNaNs; |
| 598 if (FPMO->hasNoInfs()) | 598 if (FPMO->hasNoInfs()) |
| 599 Flags |= FastMathFlags::NoInfs; | 599 Flags |= FastMathFlags::NoInfs; |
| 600 if (FPMO->hasNoSignedZeros()) | 600 if (FPMO->hasNoSignedZeros()) |
| 601 Flags |= FastMathFlags::NoSignedZeros; | 601 Flags |= FastMathFlags::NoSignedZeros; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 612 SmallVector<uint64_t, 64> &Record) { | 612 SmallVector<uint64_t, 64> &Record) { |
| 613 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { | 613 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { |
| 614 if (N->getOperand(i)) { | 614 if (N->getOperand(i)) { |
| 615 Record.push_back(VE.getTypeID(N->getOperand(i)->getType())); | 615 Record.push_back(VE.getTypeID(N->getOperand(i)->getType())); |
| 616 Record.push_back(VE.getValueID(N->getOperand(i))); | 616 Record.push_back(VE.getValueID(N->getOperand(i))); |
| 617 } else { | 617 } else { |
| 618 Record.push_back(VE.getTypeID(Type::getVoidTy(N->getContext()))); | 618 Record.push_back(VE.getTypeID(Type::getVoidTy(N->getContext()))); |
| 619 Record.push_back(0); | 619 Record.push_back(0); |
| 620 } | 620 } |
| 621 } | 621 } |
| 622 unsigned MDCode = N->isFunctionLocal() ? bitc::METADATA_FN_NODE : | 622 unsigned MDCode = N->isFunctionLocal() ? naclbitc::METADATA_FN_NODE : |
| 623 bitc::METADATA_NODE; | 623 naclbitc::METADATA_NODE; |
| 624 Stream.EmitRecord(MDCode, Record, 0); | 624 Stream.EmitRecord(MDCode, Record, 0); |
| 625 Record.clear(); | 625 Record.clear(); |
| 626 } | 626 } |
| 627 | 627 |
| 628 static void WriteModuleMetadata(const Module *M, | 628 static void WriteModuleMetadata(const Module *M, |
| 629 const NaClValueEnumerator &VE, | 629 const NaClValueEnumerator &VE, |
| 630 NaClBitstreamWriter &Stream) { | 630 NaClBitstreamWriter &Stream) { |
| 631 const NaClValueEnumerator::ValueList &Vals = VE.getMDValues(); | 631 const NaClValueEnumerator::ValueList &Vals = VE.getMDValues(); |
| 632 bool StartedMetadataBlock = false; | 632 bool StartedMetadataBlock = false; |
| 633 unsigned MDSAbbrev = 0; | 633 unsigned MDSAbbrev = 0; |
| 634 SmallVector<uint64_t, 64> Record; | 634 SmallVector<uint64_t, 64> Record; |
| 635 for (unsigned i = 0, e = Vals.size(); i != e; ++i) { | 635 for (unsigned i = 0, e = Vals.size(); i != e; ++i) { |
| 636 | 636 |
| 637 if (const MDNode *N = dyn_cast<MDNode>(Vals[i].first)) { | 637 if (const MDNode *N = dyn_cast<MDNode>(Vals[i].first)) { |
| 638 if (!N->isFunctionLocal() || !N->getFunction()) { | 638 if (!N->isFunctionLocal() || !N->getFunction()) { |
| 639 if (!StartedMetadataBlock) { | 639 if (!StartedMetadataBlock) { |
| 640 Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3); | 640 Stream.EnterSubblock(naclbitc::METADATA_BLOCK_ID, 3); |
| 641 StartedMetadataBlock = true; | 641 StartedMetadataBlock = true; |
| 642 } | 642 } |
| 643 WriteMDNode(N, VE, Stream, Record); | 643 WriteMDNode(N, VE, Stream, Record); |
| 644 } | 644 } |
| 645 } else if (const MDString *MDS = dyn_cast<MDString>(Vals[i].first)) { | 645 } else if (const MDString *MDS = dyn_cast<MDString>(Vals[i].first)) { |
| 646 if (!StartedMetadataBlock) { | 646 if (!StartedMetadataBlock) { |
| 647 Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3); | 647 Stream.EnterSubblock(naclbitc::METADATA_BLOCK_ID, 3); |
| 648 | 648 |
| 649 // Abbrev for METADATA_STRING. | 649 // Abbrev for METADATA_STRING. |
| 650 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 650 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 651 Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_STRING)); | 651 Abbv->Add(BitCodeAbbrevOp(naclbitc::METADATA_STRING)); |
| 652 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); | 652 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); |
| 653 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); | 653 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); |
| 654 MDSAbbrev = Stream.EmitAbbrev(Abbv); | 654 MDSAbbrev = Stream.EmitAbbrev(Abbv); |
| 655 StartedMetadataBlock = true; | 655 StartedMetadataBlock = true; |
| 656 } | 656 } |
| 657 | 657 |
| 658 // Code: [strchar x N] | 658 // Code: [strchar x N] |
| 659 Record.append(MDS->begin(), MDS->end()); | 659 Record.append(MDS->begin(), MDS->end()); |
| 660 | 660 |
| 661 // Emit the finished record. | 661 // Emit the finished record. |
| 662 Stream.EmitRecord(bitc::METADATA_STRING, Record, MDSAbbrev); | 662 Stream.EmitRecord(naclbitc::METADATA_STRING, Record, MDSAbbrev); |
| 663 Record.clear(); | 663 Record.clear(); |
| 664 } | 664 } |
| 665 } | 665 } |
| 666 | 666 |
| 667 // Write named metadata. | 667 // Write named metadata. |
| 668 for (Module::const_named_metadata_iterator I = M->named_metadata_begin(), | 668 for (Module::const_named_metadata_iterator I = M->named_metadata_begin(), |
| 669 E = M->named_metadata_end(); I != E; ++I) { | 669 E = M->named_metadata_end(); I != E; ++I) { |
| 670 const NamedMDNode *NMD = I; | 670 const NamedMDNode *NMD = I; |
| 671 if (!StartedMetadataBlock) { | 671 if (!StartedMetadataBlock) { |
| 672 Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3); | 672 Stream.EnterSubblock(naclbitc::METADATA_BLOCK_ID, 3); |
| 673 StartedMetadataBlock = true; | 673 StartedMetadataBlock = true; |
| 674 } | 674 } |
| 675 | 675 |
| 676 // Write name. | 676 // Write name. |
| 677 StringRef Str = NMD->getName(); | 677 StringRef Str = NMD->getName(); |
| 678 for (unsigned i = 0, e = Str.size(); i != e; ++i) | 678 for (unsigned i = 0, e = Str.size(); i != e; ++i) |
| 679 Record.push_back(Str[i]); | 679 Record.push_back(Str[i]); |
| 680 Stream.EmitRecord(bitc::METADATA_NAME, Record, 0/*TODO*/); | 680 Stream.EmitRecord(naclbitc::METADATA_NAME, Record, 0/*TODO*/); |
| 681 Record.clear(); | 681 Record.clear(); |
| 682 | 682 |
| 683 // Write named metadata operands. | 683 // Write named metadata operands. |
| 684 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) | 684 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) |
| 685 Record.push_back(VE.getValueID(NMD->getOperand(i))); | 685 Record.push_back(VE.getValueID(NMD->getOperand(i))); |
| 686 Stream.EmitRecord(bitc::METADATA_NAMED_NODE, Record, 0); | 686 Stream.EmitRecord(naclbitc::METADATA_NAMED_NODE, Record, 0); |
| 687 Record.clear(); | 687 Record.clear(); |
| 688 } | 688 } |
| 689 | 689 |
| 690 if (StartedMetadataBlock) | 690 if (StartedMetadataBlock) |
| 691 Stream.ExitBlock(); | 691 Stream.ExitBlock(); |
| 692 } | 692 } |
| 693 | 693 |
| 694 static void WriteFunctionLocalMetadata(const Function &F, | 694 static void WriteFunctionLocalMetadata(const Function &F, |
| 695 const NaClValueEnumerator &VE, | 695 const NaClValueEnumerator &VE, |
| 696 NaClBitstreamWriter &Stream) { | 696 NaClBitstreamWriter &Stream) { |
| 697 bool StartedMetadataBlock = false; | 697 bool StartedMetadataBlock = false; |
| 698 SmallVector<uint64_t, 64> Record; | 698 SmallVector<uint64_t, 64> Record; |
| 699 const SmallVector<const MDNode *, 8> &Vals = VE.getFunctionLocalMDValues(); | 699 const SmallVector<const MDNode *, 8> &Vals = VE.getFunctionLocalMDValues(); |
| 700 for (unsigned i = 0, e = Vals.size(); i != e; ++i) | 700 for (unsigned i = 0, e = Vals.size(); i != e; ++i) |
| 701 if (const MDNode *N = Vals[i]) | 701 if (const MDNode *N = Vals[i]) |
| 702 if (N->isFunctionLocal() && N->getFunction() == &F) { | 702 if (N->isFunctionLocal() && N->getFunction() == &F) { |
| 703 if (!StartedMetadataBlock) { | 703 if (!StartedMetadataBlock) { |
| 704 Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3); | 704 Stream.EnterSubblock(naclbitc::METADATA_BLOCK_ID, 3); |
| 705 StartedMetadataBlock = true; | 705 StartedMetadataBlock = true; |
| 706 } | 706 } |
| 707 WriteMDNode(N, VE, Stream, Record); | 707 WriteMDNode(N, VE, Stream, Record); |
| 708 } | 708 } |
| 709 | 709 |
| 710 if (StartedMetadataBlock) | 710 if (StartedMetadataBlock) |
| 711 Stream.ExitBlock(); | 711 Stream.ExitBlock(); |
| 712 } | 712 } |
| 713 | 713 |
| 714 static void WriteMetadataAttachment(const Function &F, | 714 static void WriteMetadataAttachment(const Function &F, |
| 715 const NaClValueEnumerator &VE, | 715 const NaClValueEnumerator &VE, |
| 716 NaClBitstreamWriter &Stream) { | 716 NaClBitstreamWriter &Stream) { |
| 717 Stream.EnterSubblock(bitc::METADATA_ATTACHMENT_ID, 3); | 717 Stream.EnterSubblock(naclbitc::METADATA_ATTACHMENT_ID, 3); |
| 718 | 718 |
| 719 SmallVector<uint64_t, 64> Record; | 719 SmallVector<uint64_t, 64> Record; |
| 720 | 720 |
| 721 // Write metadata attachments | 721 // Write metadata attachments |
| 722 // METADATA_ATTACHMENT - [m x [value, [n x [id, mdnode]]] | 722 // METADATA_ATTACHMENT - [m x [value, [n x [id, mdnode]]] |
| 723 SmallVector<std::pair<unsigned, MDNode*>, 4> MDs; | 723 SmallVector<std::pair<unsigned, MDNode*>, 4> MDs; |
| 724 | 724 |
| 725 for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB) | 725 for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB) |
| 726 for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); | 726 for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); |
| 727 I != E; ++I) { | 727 I != E; ++I) { |
| 728 MDs.clear(); | 728 MDs.clear(); |
| 729 I->getAllMetadataOtherThanDebugLoc(MDs); | 729 I->getAllMetadataOtherThanDebugLoc(MDs); |
| 730 | 730 |
| 731 // If no metadata, ignore instruction. | 731 // If no metadata, ignore instruction. |
| 732 if (MDs.empty()) continue; | 732 if (MDs.empty()) continue; |
| 733 | 733 |
| 734 Record.push_back(VE.getInstructionID(I)); | 734 Record.push_back(VE.getInstructionID(I)); |
| 735 | 735 |
| 736 for (unsigned i = 0, e = MDs.size(); i != e; ++i) { | 736 for (unsigned i = 0, e = MDs.size(); i != e; ++i) { |
| 737 Record.push_back(MDs[i].first); | 737 Record.push_back(MDs[i].first); |
| 738 Record.push_back(VE.getValueID(MDs[i].second)); | 738 Record.push_back(VE.getValueID(MDs[i].second)); |
| 739 } | 739 } |
| 740 Stream.EmitRecord(bitc::METADATA_ATTACHMENT, Record, 0); | 740 Stream.EmitRecord(naclbitc::METADATA_ATTACHMENT, Record, 0); |
| 741 Record.clear(); | 741 Record.clear(); |
| 742 } | 742 } |
| 743 | 743 |
| 744 Stream.ExitBlock(); | 744 Stream.ExitBlock(); |
| 745 } | 745 } |
| 746 | 746 |
| 747 static void WriteModuleMetadataStore(const Module *M, NaClBitstreamWriter &Strea
m) { | 747 static void WriteModuleMetadataStore(const Module *M, NaClBitstreamWriter &Strea
m) { |
| 748 SmallVector<uint64_t, 64> Record; | 748 SmallVector<uint64_t, 64> Record; |
| 749 | 749 |
| 750 // Write metadata kinds | 750 // Write metadata kinds |
| 751 // METADATA_KIND - [n x [id, name]] | 751 // METADATA_KIND - [n x [id, name]] |
| 752 SmallVector<StringRef, 8> Names; | 752 SmallVector<StringRef, 8> Names; |
| 753 M->getMDKindNames(Names); | 753 M->getMDKindNames(Names); |
| 754 | 754 |
| 755 if (Names.empty()) return; | 755 if (Names.empty()) return; |
| 756 | 756 |
| 757 Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3); | 757 Stream.EnterSubblock(naclbitc::METADATA_BLOCK_ID, 3); |
| 758 | 758 |
| 759 for (unsigned MDKindID = 0, e = Names.size(); MDKindID != e; ++MDKindID) { | 759 for (unsigned MDKindID = 0, e = Names.size(); MDKindID != e; ++MDKindID) { |
| 760 Record.push_back(MDKindID); | 760 Record.push_back(MDKindID); |
| 761 StringRef KName = Names[MDKindID]; | 761 StringRef KName = Names[MDKindID]; |
| 762 Record.append(KName.begin(), KName.end()); | 762 Record.append(KName.begin(), KName.end()); |
| 763 | 763 |
| 764 Stream.EmitRecord(bitc::METADATA_KIND, Record, 0); | 764 Stream.EmitRecord(naclbitc::METADATA_KIND, Record, 0); |
| 765 Record.clear(); | 765 Record.clear(); |
| 766 } | 766 } |
| 767 | 767 |
| 768 Stream.ExitBlock(); | 768 Stream.ExitBlock(); |
| 769 } | 769 } |
| 770 | 770 |
| 771 static void emitSignedInt64(SmallVectorImpl<uint64_t> &Vals, uint64_t V) { | 771 static void emitSignedInt64(SmallVectorImpl<uint64_t> &Vals, uint64_t V) { |
| 772 if ((int64_t)V >= 0) | 772 if ((int64_t)V >= 0) |
| 773 Vals.push_back(V << 1); | 773 Vals.push_back(V << 1); |
| 774 else | 774 else |
| 775 Vals.push_back((-V << 1) | 1); | 775 Vals.push_back((-V << 1) | 1); |
| 776 } | 776 } |
| 777 | 777 |
| 778 static void EmitAPInt(SmallVectorImpl<uint64_t> &Vals, | 778 static void EmitAPInt(SmallVectorImpl<uint64_t> &Vals, |
| 779 unsigned &Code, unsigned &AbbrevToUse, const APInt &Val, | 779 unsigned &Code, unsigned &AbbrevToUse, const APInt &Val, |
| 780 bool EmitSizeForWideNumbers = false | 780 bool EmitSizeForWideNumbers = false |
| 781 ) { | 781 ) { |
| 782 if (Val.getBitWidth() <= 64) { | 782 if (Val.getBitWidth() <= 64) { |
| 783 uint64_t V = Val.getSExtValue(); | 783 uint64_t V = Val.getSExtValue(); |
| 784 emitSignedInt64(Vals, V); | 784 emitSignedInt64(Vals, V); |
| 785 Code = bitc::CST_CODE_INTEGER; | 785 Code = naclbitc::CST_CODE_INTEGER; |
| 786 AbbrevToUse = CONSTANTS_INTEGER_ABBREV; | 786 AbbrevToUse = CONSTANTS_INTEGER_ABBREV; |
| 787 } else { | 787 } else { |
| 788 // Wide integers, > 64 bits in size. | 788 // Wide integers, > 64 bits in size. |
| 789 // We have an arbitrary precision integer value to write whose | 789 // We have an arbitrary precision integer value to write whose |
| 790 // bit width is > 64. However, in canonical unsigned integer | 790 // bit width is > 64. However, in canonical unsigned integer |
| 791 // format it is likely that the high bits are going to be zero. | 791 // format it is likely that the high bits are going to be zero. |
| 792 // So, we only write the number of active words. | 792 // So, we only write the number of active words. |
| 793 unsigned NWords = Val.getActiveWords(); | 793 unsigned NWords = Val.getActiveWords(); |
| 794 | 794 |
| 795 if (EmitSizeForWideNumbers) | 795 if (EmitSizeForWideNumbers) |
| 796 Vals.push_back(NWords); | 796 Vals.push_back(NWords); |
| 797 | 797 |
| 798 const uint64_t *RawWords = Val.getRawData(); | 798 const uint64_t *RawWords = Val.getRawData(); |
| 799 for (unsigned i = 0; i != NWords; ++i) { | 799 for (unsigned i = 0; i != NWords; ++i) { |
| 800 emitSignedInt64(Vals, RawWords[i]); | 800 emitSignedInt64(Vals, RawWords[i]); |
| 801 } | 801 } |
| 802 Code = bitc::CST_CODE_WIDE_INTEGER; | 802 Code = naclbitc::CST_CODE_WIDE_INTEGER; |
| 803 } | 803 } |
| 804 } | 804 } |
| 805 | 805 |
| 806 static void WriteConstants(unsigned FirstVal, unsigned LastVal, | 806 static void WriteConstants(unsigned FirstVal, unsigned LastVal, |
| 807 const NaClValueEnumerator &VE, | 807 const NaClValueEnumerator &VE, |
| 808 NaClBitstreamWriter &Stream, bool isGlobal) { | 808 NaClBitstreamWriter &Stream, bool isGlobal) { |
| 809 if (FirstVal == LastVal) return; | 809 if (FirstVal == LastVal) return; |
| 810 | 810 |
| 811 Stream.EnterSubblock(bitc::CONSTANTS_BLOCK_ID, 4); | 811 Stream.EnterSubblock(naclbitc::CONSTANTS_BLOCK_ID, 4); |
| 812 | 812 |
| 813 unsigned AggregateAbbrev = 0; | 813 unsigned AggregateAbbrev = 0; |
| 814 unsigned String8Abbrev = 0; | 814 unsigned String8Abbrev = 0; |
| 815 unsigned CString7Abbrev = 0; | 815 unsigned CString7Abbrev = 0; |
| 816 unsigned CString6Abbrev = 0; | 816 unsigned CString6Abbrev = 0; |
| 817 // If this is a constant pool for the module, emit module-specific abbrevs. | 817 // If this is a constant pool for the module, emit module-specific abbrevs. |
| 818 if (isGlobal) { | 818 if (isGlobal) { |
| 819 // Abbrev for CST_CODE_AGGREGATE. | 819 // Abbrev for CST_CODE_AGGREGATE. |
| 820 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 820 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 821 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_AGGREGATE)); | 821 Abbv->Add(BitCodeAbbrevOp(naclbitc::CST_CODE_AGGREGATE)); |
| 822 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); | 822 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); |
| 823 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, Log2_32_Ceil(LastVal+1))); | 823 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, Log2_32_Ceil(LastVal+1))); |
| 824 AggregateAbbrev = Stream.EmitAbbrev(Abbv); | 824 AggregateAbbrev = Stream.EmitAbbrev(Abbv); |
| 825 | 825 |
| 826 // Abbrev for CST_CODE_STRING. | 826 // Abbrev for CST_CODE_STRING. |
| 827 Abbv = new BitCodeAbbrev(); | 827 Abbv = new BitCodeAbbrev(); |
| 828 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_STRING)); | 828 Abbv->Add(BitCodeAbbrevOp(naclbitc::CST_CODE_STRING)); |
| 829 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); | 829 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); |
| 830 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); | 830 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); |
| 831 String8Abbrev = Stream.EmitAbbrev(Abbv); | 831 String8Abbrev = Stream.EmitAbbrev(Abbv); |
| 832 // Abbrev for CST_CODE_CSTRING. | 832 // Abbrev for CST_CODE_CSTRING. |
| 833 Abbv = new BitCodeAbbrev(); | 833 Abbv = new BitCodeAbbrev(); |
| 834 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_CSTRING)); | 834 Abbv->Add(BitCodeAbbrevOp(naclbitc::CST_CODE_CSTRING)); |
| 835 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); | 835 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); |
| 836 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); | 836 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); |
| 837 CString7Abbrev = Stream.EmitAbbrev(Abbv); | 837 CString7Abbrev = Stream.EmitAbbrev(Abbv); |
| 838 // Abbrev for CST_CODE_CSTRING. | 838 // Abbrev for CST_CODE_CSTRING. |
| 839 Abbv = new BitCodeAbbrev(); | 839 Abbv = new BitCodeAbbrev(); |
| 840 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_CSTRING)); | 840 Abbv->Add(BitCodeAbbrevOp(naclbitc::CST_CODE_CSTRING)); |
| 841 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); | 841 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); |
| 842 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); | 842 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); |
| 843 CString6Abbrev = Stream.EmitAbbrev(Abbv); | 843 CString6Abbrev = Stream.EmitAbbrev(Abbv); |
| 844 } | 844 } |
| 845 | 845 |
| 846 SmallVector<uint64_t, 64> Record; | 846 SmallVector<uint64_t, 64> Record; |
| 847 | 847 |
| 848 const NaClValueEnumerator::ValueList &Vals = VE.getValues(); | 848 const NaClValueEnumerator::ValueList &Vals = VE.getValues(); |
| 849 Type *LastTy = 0; | 849 Type *LastTy = 0; |
| 850 for (unsigned i = FirstVal; i != LastVal; ++i) { | 850 for (unsigned i = FirstVal; i != LastVal; ++i) { |
| 851 const Value *V = Vals[i].first; | 851 const Value *V = Vals[i].first; |
| 852 // If we need to switch types, do so now. | 852 // If we need to switch types, do so now. |
| 853 if (V->getType() != LastTy) { | 853 if (V->getType() != LastTy) { |
| 854 LastTy = V->getType(); | 854 LastTy = V->getType(); |
| 855 Record.push_back(VE.getTypeID(LastTy)); | 855 Record.push_back(VE.getTypeID(LastTy)); |
| 856 Stream.EmitRecord(bitc::CST_CODE_SETTYPE, Record, | 856 Stream.EmitRecord(naclbitc::CST_CODE_SETTYPE, Record, |
| 857 CONSTANTS_SETTYPE_ABBREV); | 857 CONSTANTS_SETTYPE_ABBREV); |
| 858 Record.clear(); | 858 Record.clear(); |
| 859 } | 859 } |
| 860 | 860 |
| 861 if (const InlineAsm *IA = dyn_cast<InlineAsm>(V)) { | 861 if (const InlineAsm *IA = dyn_cast<InlineAsm>(V)) { |
| 862 Record.push_back(unsigned(IA->hasSideEffects()) | | 862 Record.push_back(unsigned(IA->hasSideEffects()) | |
| 863 unsigned(IA->isAlignStack()) << 1 | | 863 unsigned(IA->isAlignStack()) << 1 | |
| 864 unsigned(IA->getDialect()&1) << 2); | 864 unsigned(IA->getDialect()&1) << 2); |
| 865 | 865 |
| 866 // Add the asm string. | 866 // Add the asm string. |
| 867 const std::string &AsmStr = IA->getAsmString(); | 867 const std::string &AsmStr = IA->getAsmString(); |
| 868 Record.push_back(AsmStr.size()); | 868 Record.push_back(AsmStr.size()); |
| 869 for (unsigned i = 0, e = AsmStr.size(); i != e; ++i) | 869 for (unsigned i = 0, e = AsmStr.size(); i != e; ++i) |
| 870 Record.push_back(AsmStr[i]); | 870 Record.push_back(AsmStr[i]); |
| 871 | 871 |
| 872 // Add the constraint string. | 872 // Add the constraint string. |
| 873 const std::string &ConstraintStr = IA->getConstraintString(); | 873 const std::string &ConstraintStr = IA->getConstraintString(); |
| 874 Record.push_back(ConstraintStr.size()); | 874 Record.push_back(ConstraintStr.size()); |
| 875 for (unsigned i = 0, e = ConstraintStr.size(); i != e; ++i) | 875 for (unsigned i = 0, e = ConstraintStr.size(); i != e; ++i) |
| 876 Record.push_back(ConstraintStr[i]); | 876 Record.push_back(ConstraintStr[i]); |
| 877 Stream.EmitRecord(bitc::CST_CODE_INLINEASM, Record); | 877 Stream.EmitRecord(naclbitc::CST_CODE_INLINEASM, Record); |
| 878 Record.clear(); | 878 Record.clear(); |
| 879 continue; | 879 continue; |
| 880 } | 880 } |
| 881 const Constant *C = cast<Constant>(V); | 881 const Constant *C = cast<Constant>(V); |
| 882 unsigned Code = -1U; | 882 unsigned Code = -1U; |
| 883 unsigned AbbrevToUse = 0; | 883 unsigned AbbrevToUse = 0; |
| 884 if (C->isNullValue()) { | 884 if (C->isNullValue()) { |
| 885 Code = bitc::CST_CODE_NULL; | 885 Code = naclbitc::CST_CODE_NULL; |
| 886 } else if (isa<UndefValue>(C)) { | 886 } else if (isa<UndefValue>(C)) { |
| 887 Code = bitc::CST_CODE_UNDEF; | 887 Code = naclbitc::CST_CODE_UNDEF; |
| 888 } else if (const ConstantInt *IV = dyn_cast<ConstantInt>(C)) { | 888 } else if (const ConstantInt *IV = dyn_cast<ConstantInt>(C)) { |
| 889 EmitAPInt(Record, Code, AbbrevToUse, IV->getValue()); | 889 EmitAPInt(Record, Code, AbbrevToUse, IV->getValue()); |
| 890 } else if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C)) { | 890 } else if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C)) { |
| 891 Code = bitc::CST_CODE_FLOAT; | 891 Code = naclbitc::CST_CODE_FLOAT; |
| 892 Type *Ty = CFP->getType(); | 892 Type *Ty = CFP->getType(); |
| 893 if (Ty->isHalfTy() || Ty->isFloatTy() || Ty->isDoubleTy()) { | 893 if (Ty->isHalfTy() || Ty->isFloatTy() || Ty->isDoubleTy()) { |
| 894 Record.push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue()); | 894 Record.push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue()); |
| 895 } else if (Ty->isX86_FP80Ty()) { | 895 } else if (Ty->isX86_FP80Ty()) { |
| 896 // api needed to prevent premature destruction | 896 // api needed to prevent premature destruction |
| 897 // bits are not in the same order as a normal i80 APInt, compensate. | 897 // bits are not in the same order as a normal i80 APInt, compensate. |
| 898 APInt api = CFP->getValueAPF().bitcastToAPInt(); | 898 APInt api = CFP->getValueAPF().bitcastToAPInt(); |
| 899 const uint64_t *p = api.getRawData(); | 899 const uint64_t *p = api.getRawData(); |
| 900 Record.push_back((p[1] << 48) | (p[0] >> 16)); | 900 Record.push_back((p[1] << 48) | (p[0] >> 16)); |
| 901 Record.push_back(p[0] & 0xffffLL); | 901 Record.push_back(p[0] & 0xffffLL); |
| 902 } else if (Ty->isFP128Ty() || Ty->isPPC_FP128Ty()) { | 902 } else if (Ty->isFP128Ty() || Ty->isPPC_FP128Ty()) { |
| 903 APInt api = CFP->getValueAPF().bitcastToAPInt(); | 903 APInt api = CFP->getValueAPF().bitcastToAPInt(); |
| 904 const uint64_t *p = api.getRawData(); | 904 const uint64_t *p = api.getRawData(); |
| 905 Record.push_back(p[0]); | 905 Record.push_back(p[0]); |
| 906 Record.push_back(p[1]); | 906 Record.push_back(p[1]); |
| 907 } else { | 907 } else { |
| 908 assert (0 && "Unknown FP type!"); | 908 assert (0 && "Unknown FP type!"); |
| 909 } | 909 } |
| 910 } else if (isa<ConstantDataSequential>(C) && | 910 } else if (isa<ConstantDataSequential>(C) && |
| 911 cast<ConstantDataSequential>(C)->isString()) { | 911 cast<ConstantDataSequential>(C)->isString()) { |
| 912 const ConstantDataSequential *Str = cast<ConstantDataSequential>(C); | 912 const ConstantDataSequential *Str = cast<ConstantDataSequential>(C); |
| 913 // Emit constant strings specially. | 913 // Emit constant strings specially. |
| 914 unsigned NumElts = Str->getNumElements(); | 914 unsigned NumElts = Str->getNumElements(); |
| 915 // If this is a null-terminated string, use the denser CSTRING encoding. | 915 // If this is a null-terminated string, use the denser CSTRING encoding. |
| 916 if (Str->isCString()) { | 916 if (Str->isCString()) { |
| 917 Code = bitc::CST_CODE_CSTRING; | 917 Code = naclbitc::CST_CODE_CSTRING; |
| 918 --NumElts; // Don't encode the null, which isn't allowed by char6. | 918 --NumElts; // Don't encode the null, which isn't allowed by char6. |
| 919 } else { | 919 } else { |
| 920 Code = bitc::CST_CODE_STRING; | 920 Code = naclbitc::CST_CODE_STRING; |
| 921 AbbrevToUse = String8Abbrev; | 921 AbbrevToUse = String8Abbrev; |
| 922 } | 922 } |
| 923 bool isCStr7 = Code == bitc::CST_CODE_CSTRING; | 923 bool isCStr7 = Code == naclbitc::CST_CODE_CSTRING; |
| 924 bool isCStrChar6 = Code == bitc::CST_CODE_CSTRING; | 924 bool isCStrChar6 = Code == naclbitc::CST_CODE_CSTRING; |
| 925 for (unsigned i = 0; i != NumElts; ++i) { | 925 for (unsigned i = 0; i != NumElts; ++i) { |
| 926 unsigned char V = Str->getElementAsInteger(i); | 926 unsigned char V = Str->getElementAsInteger(i); |
| 927 Record.push_back(V); | 927 Record.push_back(V); |
| 928 isCStr7 &= (V & 128) == 0; | 928 isCStr7 &= (V & 128) == 0; |
| 929 if (isCStrChar6) | 929 if (isCStrChar6) |
| 930 isCStrChar6 = BitCodeAbbrevOp::isChar6(V); | 930 isCStrChar6 = BitCodeAbbrevOp::isChar6(V); |
| 931 } | 931 } |
| 932 | 932 |
| 933 if (isCStrChar6) | 933 if (isCStrChar6) |
| 934 AbbrevToUse = CString6Abbrev; | 934 AbbrevToUse = CString6Abbrev; |
| 935 else if (isCStr7) | 935 else if (isCStr7) |
| 936 AbbrevToUse = CString7Abbrev; | 936 AbbrevToUse = CString7Abbrev; |
| 937 } else if (const ConstantDataSequential *CDS = | 937 } else if (const ConstantDataSequential *CDS = |
| 938 dyn_cast<ConstantDataSequential>(C)) { | 938 dyn_cast<ConstantDataSequential>(C)) { |
| 939 Code = bitc::CST_CODE_DATA; | 939 Code = naclbitc::CST_CODE_DATA; |
| 940 Type *EltTy = CDS->getType()->getElementType(); | 940 Type *EltTy = CDS->getType()->getElementType(); |
| 941 if (isa<IntegerType>(EltTy)) { | 941 if (isa<IntegerType>(EltTy)) { |
| 942 for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) | 942 for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) |
| 943 Record.push_back(CDS->getElementAsInteger(i)); | 943 Record.push_back(CDS->getElementAsInteger(i)); |
| 944 } else if (EltTy->isFloatTy()) { | 944 } else if (EltTy->isFloatTy()) { |
| 945 for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) { | 945 for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) { |
| 946 union { float F; uint32_t I; }; | 946 union { float F; uint32_t I; }; |
| 947 F = CDS->getElementAsFloat(i); | 947 F = CDS->getElementAsFloat(i); |
| 948 Record.push_back(I); | 948 Record.push_back(I); |
| 949 } | 949 } |
| 950 } else { | 950 } else { |
| 951 assert(EltTy->isDoubleTy() && "Unknown ConstantData element type"); | 951 assert(EltTy->isDoubleTy() && "Unknown ConstantData element type"); |
| 952 for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) { | 952 for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) { |
| 953 union { double F; uint64_t I; }; | 953 union { double F; uint64_t I; }; |
| 954 F = CDS->getElementAsDouble(i); | 954 F = CDS->getElementAsDouble(i); |
| 955 Record.push_back(I); | 955 Record.push_back(I); |
| 956 } | 956 } |
| 957 } | 957 } |
| 958 } else if (isa<ConstantArray>(C) || isa<ConstantStruct>(C) || | 958 } else if (isa<ConstantArray>(C) || isa<ConstantStruct>(C) || |
| 959 isa<ConstantVector>(C)) { | 959 isa<ConstantVector>(C)) { |
| 960 Code = bitc::CST_CODE_AGGREGATE; | 960 Code = naclbitc::CST_CODE_AGGREGATE; |
| 961 for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i) | 961 for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i) |
| 962 Record.push_back(VE.getValueID(C->getOperand(i))); | 962 Record.push_back(VE.getValueID(C->getOperand(i))); |
| 963 AbbrevToUse = AggregateAbbrev; | 963 AbbrevToUse = AggregateAbbrev; |
| 964 } else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) { | 964 } else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) { |
| 965 switch (CE->getOpcode()) { | 965 switch (CE->getOpcode()) { |
| 966 default: | 966 default: |
| 967 if (Instruction::isCast(CE->getOpcode())) { | 967 if (Instruction::isCast(CE->getOpcode())) { |
| 968 Code = bitc::CST_CODE_CE_CAST; | 968 Code = naclbitc::CST_CODE_CE_CAST; |
| 969 Record.push_back(GetEncodedCastOpcode(CE->getOpcode())); | 969 Record.push_back(GetEncodedCastOpcode(CE->getOpcode())); |
| 970 Record.push_back(VE.getTypeID(C->getOperand(0)->getType())); | 970 Record.push_back(VE.getTypeID(C->getOperand(0)->getType())); |
| 971 Record.push_back(VE.getValueID(C->getOperand(0))); | 971 Record.push_back(VE.getValueID(C->getOperand(0))); |
| 972 AbbrevToUse = CONSTANTS_CE_CAST_Abbrev; | 972 AbbrevToUse = CONSTANTS_CE_CAST_Abbrev; |
| 973 } else { | 973 } else { |
| 974 assert(CE->getNumOperands() == 2 && "Unknown constant expr!"); | 974 assert(CE->getNumOperands() == 2 && "Unknown constant expr!"); |
| 975 Code = bitc::CST_CODE_CE_BINOP; | 975 Code = naclbitc::CST_CODE_CE_BINOP; |
| 976 Record.push_back(GetEncodedBinaryOpcode(CE->getOpcode())); | 976 Record.push_back(GetEncodedBinaryOpcode(CE->getOpcode())); |
| 977 Record.push_back(VE.getValueID(C->getOperand(0))); | 977 Record.push_back(VE.getValueID(C->getOperand(0))); |
| 978 Record.push_back(VE.getValueID(C->getOperand(1))); | 978 Record.push_back(VE.getValueID(C->getOperand(1))); |
| 979 uint64_t Flags = GetOptimizationFlags(CE); | 979 uint64_t Flags = GetOptimizationFlags(CE); |
| 980 if (Flags != 0) | 980 if (Flags != 0) |
| 981 Record.push_back(Flags); | 981 Record.push_back(Flags); |
| 982 } | 982 } |
| 983 break; | 983 break; |
| 984 case Instruction::GetElementPtr: | 984 case Instruction::GetElementPtr: |
| 985 Code = bitc::CST_CODE_CE_GEP; | 985 Code = naclbitc::CST_CODE_CE_GEP; |
| 986 if (cast<GEPOperator>(C)->isInBounds()) | 986 if (cast<GEPOperator>(C)->isInBounds()) |
| 987 Code = bitc::CST_CODE_CE_INBOUNDS_GEP; | 987 Code = naclbitc::CST_CODE_CE_INBOUNDS_GEP; |
| 988 for (unsigned i = 0, e = CE->getNumOperands(); i != e; ++i) { | 988 for (unsigned i = 0, e = CE->getNumOperands(); i != e; ++i) { |
| 989 Record.push_back(VE.getTypeID(C->getOperand(i)->getType())); | 989 Record.push_back(VE.getTypeID(C->getOperand(i)->getType())); |
| 990 Record.push_back(VE.getValueID(C->getOperand(i))); | 990 Record.push_back(VE.getValueID(C->getOperand(i))); |
| 991 } | 991 } |
| 992 break; | 992 break; |
| 993 case Instruction::Select: | 993 case Instruction::Select: |
| 994 Code = bitc::CST_CODE_CE_SELECT; | 994 Code = naclbitc::CST_CODE_CE_SELECT; |
| 995 Record.push_back(VE.getValueID(C->getOperand(0))); | 995 Record.push_back(VE.getValueID(C->getOperand(0))); |
| 996 Record.push_back(VE.getValueID(C->getOperand(1))); | 996 Record.push_back(VE.getValueID(C->getOperand(1))); |
| 997 Record.push_back(VE.getValueID(C->getOperand(2))); | 997 Record.push_back(VE.getValueID(C->getOperand(2))); |
| 998 break; | 998 break; |
| 999 case Instruction::ExtractElement: | 999 case Instruction::ExtractElement: |
| 1000 Code = bitc::CST_CODE_CE_EXTRACTELT; | 1000 Code = naclbitc::CST_CODE_CE_EXTRACTELT; |
| 1001 Record.push_back(VE.getTypeID(C->getOperand(0)->getType())); | 1001 Record.push_back(VE.getTypeID(C->getOperand(0)->getType())); |
| 1002 Record.push_back(VE.getValueID(C->getOperand(0))); | 1002 Record.push_back(VE.getValueID(C->getOperand(0))); |
| 1003 Record.push_back(VE.getValueID(C->getOperand(1))); | 1003 Record.push_back(VE.getValueID(C->getOperand(1))); |
| 1004 break; | 1004 break; |
| 1005 case Instruction::InsertElement: | 1005 case Instruction::InsertElement: |
| 1006 Code = bitc::CST_CODE_CE_INSERTELT; | 1006 Code = naclbitc::CST_CODE_CE_INSERTELT; |
| 1007 Record.push_back(VE.getValueID(C->getOperand(0))); | 1007 Record.push_back(VE.getValueID(C->getOperand(0))); |
| 1008 Record.push_back(VE.getValueID(C->getOperand(1))); | 1008 Record.push_back(VE.getValueID(C->getOperand(1))); |
| 1009 Record.push_back(VE.getValueID(C->getOperand(2))); | 1009 Record.push_back(VE.getValueID(C->getOperand(2))); |
| 1010 break; | 1010 break; |
| 1011 case Instruction::ShuffleVector: | 1011 case Instruction::ShuffleVector: |
| 1012 // If the return type and argument types are the same, this is a | 1012 // If the return type and argument types are the same, this is a |
| 1013 // standard shufflevector instruction. If the types are different, | 1013 // standard shufflevector instruction. If the types are different, |
| 1014 // then the shuffle is widening or truncating the input vectors, and | 1014 // then the shuffle is widening or truncating the input vectors, and |
| 1015 // the argument type must also be encoded. | 1015 // the argument type must also be encoded. |
| 1016 if (C->getType() == C->getOperand(0)->getType()) { | 1016 if (C->getType() == C->getOperand(0)->getType()) { |
| 1017 Code = bitc::CST_CODE_CE_SHUFFLEVEC; | 1017 Code = naclbitc::CST_CODE_CE_SHUFFLEVEC; |
| 1018 } else { | 1018 } else { |
| 1019 Code = bitc::CST_CODE_CE_SHUFVEC_EX; | 1019 Code = naclbitc::CST_CODE_CE_SHUFVEC_EX; |
| 1020 Record.push_back(VE.getTypeID(C->getOperand(0)->getType())); | 1020 Record.push_back(VE.getTypeID(C->getOperand(0)->getType())); |
| 1021 } | 1021 } |
| 1022 Record.push_back(VE.getValueID(C->getOperand(0))); | 1022 Record.push_back(VE.getValueID(C->getOperand(0))); |
| 1023 Record.push_back(VE.getValueID(C->getOperand(1))); | 1023 Record.push_back(VE.getValueID(C->getOperand(1))); |
| 1024 Record.push_back(VE.getValueID(C->getOperand(2))); | 1024 Record.push_back(VE.getValueID(C->getOperand(2))); |
| 1025 break; | 1025 break; |
| 1026 case Instruction::ICmp: | 1026 case Instruction::ICmp: |
| 1027 case Instruction::FCmp: | 1027 case Instruction::FCmp: |
| 1028 Code = bitc::CST_CODE_CE_CMP; | 1028 Code = naclbitc::CST_CODE_CE_CMP; |
| 1029 Record.push_back(VE.getTypeID(C->getOperand(0)->getType())); | 1029 Record.push_back(VE.getTypeID(C->getOperand(0)->getType())); |
| 1030 Record.push_back(VE.getValueID(C->getOperand(0))); | 1030 Record.push_back(VE.getValueID(C->getOperand(0))); |
| 1031 Record.push_back(VE.getValueID(C->getOperand(1))); | 1031 Record.push_back(VE.getValueID(C->getOperand(1))); |
| 1032 Record.push_back(CE->getPredicate()); | 1032 Record.push_back(CE->getPredicate()); |
| 1033 break; | 1033 break; |
| 1034 } | 1034 } |
| 1035 } else if (const BlockAddress *BA = dyn_cast<BlockAddress>(C)) { | 1035 } else if (const BlockAddress *BA = dyn_cast<BlockAddress>(C)) { |
| 1036 Code = bitc::CST_CODE_BLOCKADDRESS; | 1036 Code = naclbitc::CST_CODE_BLOCKADDRESS; |
| 1037 Record.push_back(VE.getTypeID(BA->getFunction()->getType())); | 1037 Record.push_back(VE.getTypeID(BA->getFunction()->getType())); |
| 1038 Record.push_back(VE.getValueID(BA->getFunction())); | 1038 Record.push_back(VE.getValueID(BA->getFunction())); |
| 1039 Record.push_back(VE.getGlobalBasicBlockID(BA->getBasicBlock())); | 1039 Record.push_back(VE.getGlobalBasicBlockID(BA->getBasicBlock())); |
| 1040 } else { | 1040 } else { |
| 1041 #ifndef NDEBUG | 1041 #ifndef NDEBUG |
| 1042 C->dump(); | 1042 C->dump(); |
| 1043 #endif | 1043 #endif |
| 1044 llvm_unreachable("Unknown constant!"); | 1044 llvm_unreachable("Unknown constant!"); |
| 1045 } | 1045 } |
| 1046 Stream.EmitRecord(Code, Record, AbbrevToUse); | 1046 Stream.EmitRecord(Code, Record, AbbrevToUse); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1112 /// WriteInstruction - Emit an instruction to the specified stream. | 1112 /// WriteInstruction - Emit an instruction to the specified stream. |
| 1113 static void WriteInstruction(const Instruction &I, unsigned InstID, | 1113 static void WriteInstruction(const Instruction &I, unsigned InstID, |
| 1114 NaClValueEnumerator &VE, NaClBitstreamWriter &Strea
m, | 1114 NaClValueEnumerator &VE, NaClBitstreamWriter &Strea
m, |
| 1115 SmallVector<unsigned, 64> &Vals) { | 1115 SmallVector<unsigned, 64> &Vals) { |
| 1116 unsigned Code = 0; | 1116 unsigned Code = 0; |
| 1117 unsigned AbbrevToUse = 0; | 1117 unsigned AbbrevToUse = 0; |
| 1118 VE.setInstructionID(&I); | 1118 VE.setInstructionID(&I); |
| 1119 switch (I.getOpcode()) { | 1119 switch (I.getOpcode()) { |
| 1120 default: | 1120 default: |
| 1121 if (Instruction::isCast(I.getOpcode())) { | 1121 if (Instruction::isCast(I.getOpcode())) { |
| 1122 Code = bitc::FUNC_CODE_INST_CAST; | 1122 Code = naclbitc::FUNC_CODE_INST_CAST; |
| 1123 if (!PushValueAndType(I.getOperand(0), InstID, Vals, VE)) | 1123 if (!PushValueAndType(I.getOperand(0), InstID, Vals, VE)) |
| 1124 AbbrevToUse = FUNCTION_INST_CAST_ABBREV; | 1124 AbbrevToUse = FUNCTION_INST_CAST_ABBREV; |
| 1125 Vals.push_back(VE.getTypeID(I.getType())); | 1125 Vals.push_back(VE.getTypeID(I.getType())); |
| 1126 Vals.push_back(GetEncodedCastOpcode(I.getOpcode())); | 1126 Vals.push_back(GetEncodedCastOpcode(I.getOpcode())); |
| 1127 } else { | 1127 } else { |
| 1128 assert(isa<BinaryOperator>(I) && "Unknown instruction!"); | 1128 assert(isa<BinaryOperator>(I) && "Unknown instruction!"); |
| 1129 Code = bitc::FUNC_CODE_INST_BINOP; | 1129 Code = naclbitc::FUNC_CODE_INST_BINOP; |
| 1130 if (!PushValueAndType(I.getOperand(0), InstID, Vals, VE)) | 1130 if (!PushValueAndType(I.getOperand(0), InstID, Vals, VE)) |
| 1131 AbbrevToUse = FUNCTION_INST_BINOP_ABBREV; | 1131 AbbrevToUse = FUNCTION_INST_BINOP_ABBREV; |
| 1132 pushValue(I.getOperand(1), InstID, Vals, VE); | 1132 pushValue(I.getOperand(1), InstID, Vals, VE); |
| 1133 Vals.push_back(GetEncodedBinaryOpcode(I.getOpcode())); | 1133 Vals.push_back(GetEncodedBinaryOpcode(I.getOpcode())); |
| 1134 uint64_t Flags = GetOptimizationFlags(&I); | 1134 uint64_t Flags = GetOptimizationFlags(&I); |
| 1135 if (Flags != 0) { | 1135 if (Flags != 0) { |
| 1136 if (AbbrevToUse == FUNCTION_INST_BINOP_ABBREV) | 1136 if (AbbrevToUse == FUNCTION_INST_BINOP_ABBREV) |
| 1137 AbbrevToUse = FUNCTION_INST_BINOP_FLAGS_ABBREV; | 1137 AbbrevToUse = FUNCTION_INST_BINOP_FLAGS_ABBREV; |
| 1138 Vals.push_back(Flags); | 1138 Vals.push_back(Flags); |
| 1139 } | 1139 } |
| 1140 } | 1140 } |
| 1141 break; | 1141 break; |
| 1142 | 1142 |
| 1143 case Instruction::GetElementPtr: | 1143 case Instruction::GetElementPtr: |
| 1144 Code = bitc::FUNC_CODE_INST_GEP; | 1144 Code = naclbitc::FUNC_CODE_INST_GEP; |
| 1145 if (cast<GEPOperator>(&I)->isInBounds()) | 1145 if (cast<GEPOperator>(&I)->isInBounds()) |
| 1146 Code = bitc::FUNC_CODE_INST_INBOUNDS_GEP; | 1146 Code = naclbitc::FUNC_CODE_INST_INBOUNDS_GEP; |
| 1147 for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i) | 1147 for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i) |
| 1148 PushValueAndType(I.getOperand(i), InstID, Vals, VE); | 1148 PushValueAndType(I.getOperand(i), InstID, Vals, VE); |
| 1149 break; | 1149 break; |
| 1150 case Instruction::ExtractValue: { | 1150 case Instruction::ExtractValue: { |
| 1151 Code = bitc::FUNC_CODE_INST_EXTRACTVAL; | 1151 Code = naclbitc::FUNC_CODE_INST_EXTRACTVAL; |
| 1152 PushValueAndType(I.getOperand(0), InstID, Vals, VE); | 1152 PushValueAndType(I.getOperand(0), InstID, Vals, VE); |
| 1153 const ExtractValueInst *EVI = cast<ExtractValueInst>(&I); | 1153 const ExtractValueInst *EVI = cast<ExtractValueInst>(&I); |
| 1154 for (const unsigned *i = EVI->idx_begin(), *e = EVI->idx_end(); i != e; ++i) | 1154 for (const unsigned *i = EVI->idx_begin(), *e = EVI->idx_end(); i != e; ++i) |
| 1155 Vals.push_back(*i); | 1155 Vals.push_back(*i); |
| 1156 break; | 1156 break; |
| 1157 } | 1157 } |
| 1158 case Instruction::InsertValue: { | 1158 case Instruction::InsertValue: { |
| 1159 Code = bitc::FUNC_CODE_INST_INSERTVAL; | 1159 Code = naclbitc::FUNC_CODE_INST_INSERTVAL; |
| 1160 PushValueAndType(I.getOperand(0), InstID, Vals, VE); | 1160 PushValueAndType(I.getOperand(0), InstID, Vals, VE); |
| 1161 PushValueAndType(I.getOperand(1), InstID, Vals, VE); | 1161 PushValueAndType(I.getOperand(1), InstID, Vals, VE); |
| 1162 const InsertValueInst *IVI = cast<InsertValueInst>(&I); | 1162 const InsertValueInst *IVI = cast<InsertValueInst>(&I); |
| 1163 for (const unsigned *i = IVI->idx_begin(), *e = IVI->idx_end(); i != e; ++i) | 1163 for (const unsigned *i = IVI->idx_begin(), *e = IVI->idx_end(); i != e; ++i) |
| 1164 Vals.push_back(*i); | 1164 Vals.push_back(*i); |
| 1165 break; | 1165 break; |
| 1166 } | 1166 } |
| 1167 case Instruction::Select: | 1167 case Instruction::Select: |
| 1168 Code = bitc::FUNC_CODE_INST_VSELECT; | 1168 Code = naclbitc::FUNC_CODE_INST_VSELECT; |
| 1169 PushValueAndType(I.getOperand(1), InstID, Vals, VE); | 1169 PushValueAndType(I.getOperand(1), InstID, Vals, VE); |
| 1170 pushValue(I.getOperand(2), InstID, Vals, VE); | 1170 pushValue(I.getOperand(2), InstID, Vals, VE); |
| 1171 PushValueAndType(I.getOperand(0), InstID, Vals, VE); | 1171 PushValueAndType(I.getOperand(0), InstID, Vals, VE); |
| 1172 break; | 1172 break; |
| 1173 case Instruction::ExtractElement: | 1173 case Instruction::ExtractElement: |
| 1174 Code = bitc::FUNC_CODE_INST_EXTRACTELT; | 1174 Code = naclbitc::FUNC_CODE_INST_EXTRACTELT; |
| 1175 PushValueAndType(I.getOperand(0), InstID, Vals, VE); | 1175 PushValueAndType(I.getOperand(0), InstID, Vals, VE); |
| 1176 pushValue(I.getOperand(1), InstID, Vals, VE); | 1176 pushValue(I.getOperand(1), InstID, Vals, VE); |
| 1177 break; | 1177 break; |
| 1178 case Instruction::InsertElement: | 1178 case Instruction::InsertElement: |
| 1179 Code = bitc::FUNC_CODE_INST_INSERTELT; | 1179 Code = naclbitc::FUNC_CODE_INST_INSERTELT; |
| 1180 PushValueAndType(I.getOperand(0), InstID, Vals, VE); | 1180 PushValueAndType(I.getOperand(0), InstID, Vals, VE); |
| 1181 pushValue(I.getOperand(1), InstID, Vals, VE); | 1181 pushValue(I.getOperand(1), InstID, Vals, VE); |
| 1182 pushValue(I.getOperand(2), InstID, Vals, VE); | 1182 pushValue(I.getOperand(2), InstID, Vals, VE); |
| 1183 break; | 1183 break; |
| 1184 case Instruction::ShuffleVector: | 1184 case Instruction::ShuffleVector: |
| 1185 Code = bitc::FUNC_CODE_INST_SHUFFLEVEC; | 1185 Code = naclbitc::FUNC_CODE_INST_SHUFFLEVEC; |
| 1186 PushValueAndType(I.getOperand(0), InstID, Vals, VE); | 1186 PushValueAndType(I.getOperand(0), InstID, Vals, VE); |
| 1187 pushValue(I.getOperand(1), InstID, Vals, VE); | 1187 pushValue(I.getOperand(1), InstID, Vals, VE); |
| 1188 pushValue(I.getOperand(2), InstID, Vals, VE); | 1188 pushValue(I.getOperand(2), InstID, Vals, VE); |
| 1189 break; | 1189 break; |
| 1190 case Instruction::ICmp: | 1190 case Instruction::ICmp: |
| 1191 case Instruction::FCmp: | 1191 case Instruction::FCmp: |
| 1192 // compare returning Int1Ty or vector of Int1Ty | 1192 // compare returning Int1Ty or vector of Int1Ty |
| 1193 Code = bitc::FUNC_CODE_INST_CMP2; | 1193 Code = naclbitc::FUNC_CODE_INST_CMP2; |
| 1194 PushValueAndType(I.getOperand(0), InstID, Vals, VE); | 1194 PushValueAndType(I.getOperand(0), InstID, Vals, VE); |
| 1195 pushValue(I.getOperand(1), InstID, Vals, VE); | 1195 pushValue(I.getOperand(1), InstID, Vals, VE); |
| 1196 Vals.push_back(cast<CmpInst>(I).getPredicate()); | 1196 Vals.push_back(cast<CmpInst>(I).getPredicate()); |
| 1197 break; | 1197 break; |
| 1198 | 1198 |
| 1199 case Instruction::Ret: | 1199 case Instruction::Ret: |
| 1200 { | 1200 { |
| 1201 Code = bitc::FUNC_CODE_INST_RET; | 1201 Code = naclbitc::FUNC_CODE_INST_RET; |
| 1202 unsigned NumOperands = I.getNumOperands(); | 1202 unsigned NumOperands = I.getNumOperands(); |
| 1203 if (NumOperands == 0) | 1203 if (NumOperands == 0) |
| 1204 AbbrevToUse = FUNCTION_INST_RET_VOID_ABBREV; | 1204 AbbrevToUse = FUNCTION_INST_RET_VOID_ABBREV; |
| 1205 else if (NumOperands == 1) { | 1205 else if (NumOperands == 1) { |
| 1206 if (!PushValueAndType(I.getOperand(0), InstID, Vals, VE)) | 1206 if (!PushValueAndType(I.getOperand(0), InstID, Vals, VE)) |
| 1207 AbbrevToUse = FUNCTION_INST_RET_VAL_ABBREV; | 1207 AbbrevToUse = FUNCTION_INST_RET_VAL_ABBREV; |
| 1208 } else { | 1208 } else { |
| 1209 for (unsigned i = 0, e = NumOperands; i != e; ++i) | 1209 for (unsigned i = 0, e = NumOperands; i != e; ++i) |
| 1210 PushValueAndType(I.getOperand(i), InstID, Vals, VE); | 1210 PushValueAndType(I.getOperand(i), InstID, Vals, VE); |
| 1211 } | 1211 } |
| 1212 } | 1212 } |
| 1213 break; | 1213 break; |
| 1214 case Instruction::Br: | 1214 case Instruction::Br: |
| 1215 { | 1215 { |
| 1216 Code = bitc::FUNC_CODE_INST_BR; | 1216 Code = naclbitc::FUNC_CODE_INST_BR; |
| 1217 const BranchInst &II = cast<BranchInst>(I); | 1217 const BranchInst &II = cast<BranchInst>(I); |
| 1218 Vals.push_back(VE.getValueID(II.getSuccessor(0))); | 1218 Vals.push_back(VE.getValueID(II.getSuccessor(0))); |
| 1219 if (II.isConditional()) { | 1219 if (II.isConditional()) { |
| 1220 Vals.push_back(VE.getValueID(II.getSuccessor(1))); | 1220 Vals.push_back(VE.getValueID(II.getSuccessor(1))); |
| 1221 pushValue(II.getCondition(), InstID, Vals, VE); | 1221 pushValue(II.getCondition(), InstID, Vals, VE); |
| 1222 } | 1222 } |
| 1223 } | 1223 } |
| 1224 break; | 1224 break; |
| 1225 case Instruction::Switch: | 1225 case Instruction::Switch: |
| 1226 { | 1226 { |
| 1227 // Redefine Vals, since here we need to use 64 bit values | 1227 // Redefine Vals, since here we need to use 64 bit values |
| 1228 // explicitly to store large APInt numbers. | 1228 // explicitly to store large APInt numbers. |
| 1229 SmallVector<uint64_t, 128> Vals64; | 1229 SmallVector<uint64_t, 128> Vals64; |
| 1230 | 1230 |
| 1231 Code = bitc::FUNC_CODE_INST_SWITCH; | 1231 Code = naclbitc::FUNC_CODE_INST_SWITCH; |
| 1232 const SwitchInst &SI = cast<SwitchInst>(I); | 1232 const SwitchInst &SI = cast<SwitchInst>(I); |
| 1233 | 1233 |
| 1234 uint32_t SwitchRecordHeader = SI.hash() | (SWITCH_INST_MAGIC << 16); | 1234 uint32_t SwitchRecordHeader = SI.hash() | (SWITCH_INST_MAGIC << 16); |
| 1235 Vals64.push_back(SwitchRecordHeader); | 1235 Vals64.push_back(SwitchRecordHeader); |
| 1236 | 1236 |
| 1237 Vals64.push_back(VE.getTypeID(SI.getCondition()->getType())); | 1237 Vals64.push_back(VE.getTypeID(SI.getCondition()->getType())); |
| 1238 pushValue64(SI.getCondition(), InstID, Vals64, VE); | 1238 pushValue64(SI.getCondition(), InstID, Vals64, VE); |
| 1239 Vals64.push_back(VE.getValueID(SI.getDefaultDest())); | 1239 Vals64.push_back(VE.getValueID(SI.getDefaultDest())); |
| 1240 Vals64.push_back(SI.getNumCases()); | 1240 Vals64.push_back(SI.getNumCases()); |
| 1241 for (SwitchInst::ConstCaseIt i = SI.case_begin(), e = SI.case_end(); | 1241 for (SwitchInst::ConstCaseIt i = SI.case_begin(), e = SI.case_end(); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1277 } | 1277 } |
| 1278 | 1278 |
| 1279 Stream.EmitRecord(Code, Vals64, AbbrevToUse); | 1279 Stream.EmitRecord(Code, Vals64, AbbrevToUse); |
| 1280 | 1280 |
| 1281 // Also do expected action - clear external Vals collection: | 1281 // Also do expected action - clear external Vals collection: |
| 1282 Vals.clear(); | 1282 Vals.clear(); |
| 1283 return; | 1283 return; |
| 1284 } | 1284 } |
| 1285 break; | 1285 break; |
| 1286 case Instruction::IndirectBr: | 1286 case Instruction::IndirectBr: |
| 1287 Code = bitc::FUNC_CODE_INST_INDIRECTBR; | 1287 Code = naclbitc::FUNC_CODE_INST_INDIRECTBR; |
| 1288 Vals.push_back(VE.getTypeID(I.getOperand(0)->getType())); | 1288 Vals.push_back(VE.getTypeID(I.getOperand(0)->getType())); |
| 1289 // Encode the address operand as relative, but not the basic blocks. | 1289 // Encode the address operand as relative, but not the basic blocks. |
| 1290 pushValue(I.getOperand(0), InstID, Vals, VE); | 1290 pushValue(I.getOperand(0), InstID, Vals, VE); |
| 1291 for (unsigned i = 1, e = I.getNumOperands(); i != e; ++i) | 1291 for (unsigned i = 1, e = I.getNumOperands(); i != e; ++i) |
| 1292 Vals.push_back(VE.getValueID(I.getOperand(i))); | 1292 Vals.push_back(VE.getValueID(I.getOperand(i))); |
| 1293 break; | 1293 break; |
| 1294 | 1294 |
| 1295 case Instruction::Invoke: { | 1295 case Instruction::Invoke: { |
| 1296 const InvokeInst *II = cast<InvokeInst>(&I); | 1296 const InvokeInst *II = cast<InvokeInst>(&I); |
| 1297 const Value *Callee(II->getCalledValue()); | 1297 const Value *Callee(II->getCalledValue()); |
| 1298 PointerType *PTy = cast<PointerType>(Callee->getType()); | 1298 PointerType *PTy = cast<PointerType>(Callee->getType()); |
| 1299 FunctionType *FTy = cast<FunctionType>(PTy->getElementType()); | 1299 FunctionType *FTy = cast<FunctionType>(PTy->getElementType()); |
| 1300 Code = bitc::FUNC_CODE_INST_INVOKE; | 1300 Code = naclbitc::FUNC_CODE_INST_INVOKE; |
| 1301 | 1301 |
| 1302 Vals.push_back(VE.getAttributeID(II->getAttributes())); | 1302 Vals.push_back(VE.getAttributeID(II->getAttributes())); |
| 1303 Vals.push_back(II->getCallingConv()); | 1303 Vals.push_back(II->getCallingConv()); |
| 1304 Vals.push_back(VE.getValueID(II->getNormalDest())); | 1304 Vals.push_back(VE.getValueID(II->getNormalDest())); |
| 1305 Vals.push_back(VE.getValueID(II->getUnwindDest())); | 1305 Vals.push_back(VE.getValueID(II->getUnwindDest())); |
| 1306 PushValueAndType(Callee, InstID, Vals, VE); | 1306 PushValueAndType(Callee, InstID, Vals, VE); |
| 1307 | 1307 |
| 1308 // Emit value #'s for the fixed parameters. | 1308 // Emit value #'s for the fixed parameters. |
| 1309 for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) | 1309 for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) |
| 1310 pushValue(I.getOperand(i), InstID, Vals, VE); // fixed param. | 1310 pushValue(I.getOperand(i), InstID, Vals, VE); // fixed param. |
| 1311 | 1311 |
| 1312 // Emit type/value pairs for varargs params. | 1312 // Emit type/value pairs for varargs params. |
| 1313 if (FTy->isVarArg()) { | 1313 if (FTy->isVarArg()) { |
| 1314 for (unsigned i = FTy->getNumParams(), e = I.getNumOperands()-3; | 1314 for (unsigned i = FTy->getNumParams(), e = I.getNumOperands()-3; |
| 1315 i != e; ++i) | 1315 i != e; ++i) |
| 1316 PushValueAndType(I.getOperand(i), InstID, Vals, VE); // vararg | 1316 PushValueAndType(I.getOperand(i), InstID, Vals, VE); // vararg |
| 1317 } | 1317 } |
| 1318 break; | 1318 break; |
| 1319 } | 1319 } |
| 1320 case Instruction::Resume: | 1320 case Instruction::Resume: |
| 1321 Code = bitc::FUNC_CODE_INST_RESUME; | 1321 Code = naclbitc::FUNC_CODE_INST_RESUME; |
| 1322 PushValueAndType(I.getOperand(0), InstID, Vals, VE); | 1322 PushValueAndType(I.getOperand(0), InstID, Vals, VE); |
| 1323 break; | 1323 break; |
| 1324 case Instruction::Unreachable: | 1324 case Instruction::Unreachable: |
| 1325 Code = bitc::FUNC_CODE_INST_UNREACHABLE; | 1325 Code = naclbitc::FUNC_CODE_INST_UNREACHABLE; |
| 1326 AbbrevToUse = FUNCTION_INST_UNREACHABLE_ABBREV; | 1326 AbbrevToUse = FUNCTION_INST_UNREACHABLE_ABBREV; |
| 1327 break; | 1327 break; |
| 1328 | 1328 |
| 1329 case Instruction::PHI: { | 1329 case Instruction::PHI: { |
| 1330 const PHINode &PN = cast<PHINode>(I); | 1330 const PHINode &PN = cast<PHINode>(I); |
| 1331 Code = bitc::FUNC_CODE_INST_PHI; | 1331 Code = naclbitc::FUNC_CODE_INST_PHI; |
| 1332 // With the newer instruction encoding, forward references could give | 1332 // With the newer instruction encoding, forward references could give |
| 1333 // negative valued IDs. This is most common for PHIs, so we use | 1333 // negative valued IDs. This is most common for PHIs, so we use |
| 1334 // signed VBRs. | 1334 // signed VBRs. |
| 1335 SmallVector<uint64_t, 128> Vals64; | 1335 SmallVector<uint64_t, 128> Vals64; |
| 1336 Vals64.push_back(VE.getTypeID(PN.getType())); | 1336 Vals64.push_back(VE.getTypeID(PN.getType())); |
| 1337 for (unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i) { | 1337 for (unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i) { |
| 1338 pushValueSigned(PN.getIncomingValue(i), InstID, Vals64, VE); | 1338 pushValueSigned(PN.getIncomingValue(i), InstID, Vals64, VE); |
| 1339 Vals64.push_back(VE.getValueID(PN.getIncomingBlock(i))); | 1339 Vals64.push_back(VE.getValueID(PN.getIncomingBlock(i))); |
| 1340 } | 1340 } |
| 1341 // Emit a Vals64 vector and exit. | 1341 // Emit a Vals64 vector and exit. |
| 1342 Stream.EmitRecord(Code, Vals64, AbbrevToUse); | 1342 Stream.EmitRecord(Code, Vals64, AbbrevToUse); |
| 1343 Vals64.clear(); | 1343 Vals64.clear(); |
| 1344 return; | 1344 return; |
| 1345 } | 1345 } |
| 1346 | 1346 |
| 1347 case Instruction::LandingPad: { | 1347 case Instruction::LandingPad: { |
| 1348 const LandingPadInst &LP = cast<LandingPadInst>(I); | 1348 const LandingPadInst &LP = cast<LandingPadInst>(I); |
| 1349 Code = bitc::FUNC_CODE_INST_LANDINGPAD; | 1349 Code = naclbitc::FUNC_CODE_INST_LANDINGPAD; |
| 1350 Vals.push_back(VE.getTypeID(LP.getType())); | 1350 Vals.push_back(VE.getTypeID(LP.getType())); |
| 1351 PushValueAndType(LP.getPersonalityFn(), InstID, Vals, VE); | 1351 PushValueAndType(LP.getPersonalityFn(), InstID, Vals, VE); |
| 1352 Vals.push_back(LP.isCleanup()); | 1352 Vals.push_back(LP.isCleanup()); |
| 1353 Vals.push_back(LP.getNumClauses()); | 1353 Vals.push_back(LP.getNumClauses()); |
| 1354 for (unsigned I = 0, E = LP.getNumClauses(); I != E; ++I) { | 1354 for (unsigned I = 0, E = LP.getNumClauses(); I != E; ++I) { |
| 1355 if (LP.isCatch(I)) | 1355 if (LP.isCatch(I)) |
| 1356 Vals.push_back(LandingPadInst::Catch); | 1356 Vals.push_back(LandingPadInst::Catch); |
| 1357 else | 1357 else |
| 1358 Vals.push_back(LandingPadInst::Filter); | 1358 Vals.push_back(LandingPadInst::Filter); |
| 1359 PushValueAndType(LP.getClause(I), InstID, Vals, VE); | 1359 PushValueAndType(LP.getClause(I), InstID, Vals, VE); |
| 1360 } | 1360 } |
| 1361 break; | 1361 break; |
| 1362 } | 1362 } |
| 1363 | 1363 |
| 1364 case Instruction::Alloca: | 1364 case Instruction::Alloca: |
| 1365 Code = bitc::FUNC_CODE_INST_ALLOCA; | 1365 Code = naclbitc::FUNC_CODE_INST_ALLOCA; |
| 1366 Vals.push_back(VE.getTypeID(I.getType())); | 1366 Vals.push_back(VE.getTypeID(I.getType())); |
| 1367 Vals.push_back(VE.getTypeID(I.getOperand(0)->getType())); | 1367 Vals.push_back(VE.getTypeID(I.getOperand(0)->getType())); |
| 1368 Vals.push_back(VE.getValueID(I.getOperand(0))); // size. | 1368 Vals.push_back(VE.getValueID(I.getOperand(0))); // size. |
| 1369 Vals.push_back(Log2_32(cast<AllocaInst>(I).getAlignment())+1); | 1369 Vals.push_back(Log2_32(cast<AllocaInst>(I).getAlignment())+1); |
| 1370 break; | 1370 break; |
| 1371 | 1371 |
| 1372 case Instruction::Load: | 1372 case Instruction::Load: |
| 1373 if (cast<LoadInst>(I).isAtomic()) { | 1373 if (cast<LoadInst>(I).isAtomic()) { |
| 1374 Code = bitc::FUNC_CODE_INST_LOADATOMIC; | 1374 Code = naclbitc::FUNC_CODE_INST_LOADATOMIC; |
| 1375 PushValueAndType(I.getOperand(0), InstID, Vals, VE); | 1375 PushValueAndType(I.getOperand(0), InstID, Vals, VE); |
| 1376 } else { | 1376 } else { |
| 1377 Code = bitc::FUNC_CODE_INST_LOAD; | 1377 Code = naclbitc::FUNC_CODE_INST_LOAD; |
| 1378 if (!PushValueAndType(I.getOperand(0), InstID, Vals, VE)) // ptr | 1378 if (!PushValueAndType(I.getOperand(0), InstID, Vals, VE)) // ptr |
| 1379 AbbrevToUse = FUNCTION_INST_LOAD_ABBREV; | 1379 AbbrevToUse = FUNCTION_INST_LOAD_ABBREV; |
| 1380 } | 1380 } |
| 1381 Vals.push_back(Log2_32(cast<LoadInst>(I).getAlignment())+1); | 1381 Vals.push_back(Log2_32(cast<LoadInst>(I).getAlignment())+1); |
| 1382 Vals.push_back(cast<LoadInst>(I).isVolatile()); | 1382 Vals.push_back(cast<LoadInst>(I).isVolatile()); |
| 1383 if (cast<LoadInst>(I).isAtomic()) { | 1383 if (cast<LoadInst>(I).isAtomic()) { |
| 1384 Vals.push_back(GetEncodedOrdering(cast<LoadInst>(I).getOrdering())); | 1384 Vals.push_back(GetEncodedOrdering(cast<LoadInst>(I).getOrdering())); |
| 1385 Vals.push_back(GetEncodedSynchScope(cast<LoadInst>(I).getSynchScope())); | 1385 Vals.push_back(GetEncodedSynchScope(cast<LoadInst>(I).getSynchScope())); |
| 1386 } | 1386 } |
| 1387 break; | 1387 break; |
| 1388 case Instruction::Store: | 1388 case Instruction::Store: |
| 1389 if (cast<StoreInst>(I).isAtomic()) | 1389 if (cast<StoreInst>(I).isAtomic()) |
| 1390 Code = bitc::FUNC_CODE_INST_STOREATOMIC; | 1390 Code = naclbitc::FUNC_CODE_INST_STOREATOMIC; |
| 1391 else | 1391 else |
| 1392 Code = bitc::FUNC_CODE_INST_STORE; | 1392 Code = naclbitc::FUNC_CODE_INST_STORE; |
| 1393 PushValueAndType(I.getOperand(1), InstID, Vals, VE); // ptrty + ptr | 1393 PushValueAndType(I.getOperand(1), InstID, Vals, VE); // ptrty + ptr |
| 1394 pushValue(I.getOperand(0), InstID, Vals, VE); // val. | 1394 pushValue(I.getOperand(0), InstID, Vals, VE); // val. |
| 1395 Vals.push_back(Log2_32(cast<StoreInst>(I).getAlignment())+1); | 1395 Vals.push_back(Log2_32(cast<StoreInst>(I).getAlignment())+1); |
| 1396 Vals.push_back(cast<StoreInst>(I).isVolatile()); | 1396 Vals.push_back(cast<StoreInst>(I).isVolatile()); |
| 1397 if (cast<StoreInst>(I).isAtomic()) { | 1397 if (cast<StoreInst>(I).isAtomic()) { |
| 1398 Vals.push_back(GetEncodedOrdering(cast<StoreInst>(I).getOrdering())); | 1398 Vals.push_back(GetEncodedOrdering(cast<StoreInst>(I).getOrdering())); |
| 1399 Vals.push_back(GetEncodedSynchScope(cast<StoreInst>(I).getSynchScope())); | 1399 Vals.push_back(GetEncodedSynchScope(cast<StoreInst>(I).getSynchScope())); |
| 1400 } | 1400 } |
| 1401 break; | 1401 break; |
| 1402 case Instruction::AtomicCmpXchg: | 1402 case Instruction::AtomicCmpXchg: |
| 1403 Code = bitc::FUNC_CODE_INST_CMPXCHG; | 1403 Code = naclbitc::FUNC_CODE_INST_CMPXCHG; |
| 1404 PushValueAndType(I.getOperand(0), InstID, Vals, VE); // ptrty + ptr | 1404 PushValueAndType(I.getOperand(0), InstID, Vals, VE); // ptrty + ptr |
| 1405 pushValue(I.getOperand(1), InstID, Vals, VE); // cmp. | 1405 pushValue(I.getOperand(1), InstID, Vals, VE); // cmp. |
| 1406 pushValue(I.getOperand(2), InstID, Vals, VE); // newval. | 1406 pushValue(I.getOperand(2), InstID, Vals, VE); // newval. |
| 1407 Vals.push_back(cast<AtomicCmpXchgInst>(I).isVolatile()); | 1407 Vals.push_back(cast<AtomicCmpXchgInst>(I).isVolatile()); |
| 1408 Vals.push_back(GetEncodedOrdering( | 1408 Vals.push_back(GetEncodedOrdering( |
| 1409 cast<AtomicCmpXchgInst>(I).getOrdering())); | 1409 cast<AtomicCmpXchgInst>(I).getOrdering())); |
| 1410 Vals.push_back(GetEncodedSynchScope( | 1410 Vals.push_back(GetEncodedSynchScope( |
| 1411 cast<AtomicCmpXchgInst>(I).getSynchScope())); | 1411 cast<AtomicCmpXchgInst>(I).getSynchScope())); |
| 1412 break; | 1412 break; |
| 1413 case Instruction::AtomicRMW: | 1413 case Instruction::AtomicRMW: |
| 1414 Code = bitc::FUNC_CODE_INST_ATOMICRMW; | 1414 Code = naclbitc::FUNC_CODE_INST_ATOMICRMW; |
| 1415 PushValueAndType(I.getOperand(0), InstID, Vals, VE); // ptrty + ptr | 1415 PushValueAndType(I.getOperand(0), InstID, Vals, VE); // ptrty + ptr |
| 1416 pushValue(I.getOperand(1), InstID, Vals, VE); // val. | 1416 pushValue(I.getOperand(1), InstID, Vals, VE); // val. |
| 1417 Vals.push_back(GetEncodedRMWOperation( | 1417 Vals.push_back(GetEncodedRMWOperation( |
| 1418 cast<AtomicRMWInst>(I).getOperation())); | 1418 cast<AtomicRMWInst>(I).getOperation())); |
| 1419 Vals.push_back(cast<AtomicRMWInst>(I).isVolatile()); | 1419 Vals.push_back(cast<AtomicRMWInst>(I).isVolatile()); |
| 1420 Vals.push_back(GetEncodedOrdering(cast<AtomicRMWInst>(I).getOrdering())); | 1420 Vals.push_back(GetEncodedOrdering(cast<AtomicRMWInst>(I).getOrdering())); |
| 1421 Vals.push_back(GetEncodedSynchScope( | 1421 Vals.push_back(GetEncodedSynchScope( |
| 1422 cast<AtomicRMWInst>(I).getSynchScope())); | 1422 cast<AtomicRMWInst>(I).getSynchScope())); |
| 1423 break; | 1423 break; |
| 1424 case Instruction::Fence: | 1424 case Instruction::Fence: |
| 1425 Code = bitc::FUNC_CODE_INST_FENCE; | 1425 Code = naclbitc::FUNC_CODE_INST_FENCE; |
| 1426 Vals.push_back(GetEncodedOrdering(cast<FenceInst>(I).getOrdering())); | 1426 Vals.push_back(GetEncodedOrdering(cast<FenceInst>(I).getOrdering())); |
| 1427 Vals.push_back(GetEncodedSynchScope(cast<FenceInst>(I).getSynchScope())); | 1427 Vals.push_back(GetEncodedSynchScope(cast<FenceInst>(I).getSynchScope())); |
| 1428 break; | 1428 break; |
| 1429 case Instruction::Call: { | 1429 case Instruction::Call: { |
| 1430 const CallInst &CI = cast<CallInst>(I); | 1430 const CallInst &CI = cast<CallInst>(I); |
| 1431 PointerType *PTy = cast<PointerType>(CI.getCalledValue()->getType()); | 1431 PointerType *PTy = cast<PointerType>(CI.getCalledValue()->getType()); |
| 1432 FunctionType *FTy = cast<FunctionType>(PTy->getElementType()); | 1432 FunctionType *FTy = cast<FunctionType>(PTy->getElementType()); |
| 1433 | 1433 |
| 1434 Code = bitc::FUNC_CODE_INST_CALL; | 1434 Code = naclbitc::FUNC_CODE_INST_CALL; |
| 1435 | 1435 |
| 1436 Vals.push_back(VE.getAttributeID(CI.getAttributes())); | 1436 Vals.push_back(VE.getAttributeID(CI.getAttributes())); |
| 1437 Vals.push_back((CI.getCallingConv() << 1) | unsigned(CI.isTailCall())); | 1437 Vals.push_back((CI.getCallingConv() << 1) | unsigned(CI.isTailCall())); |
| 1438 PushValueAndType(CI.getCalledValue(), InstID, Vals, VE); // Callee | 1438 PushValueAndType(CI.getCalledValue(), InstID, Vals, VE); // Callee |
| 1439 | 1439 |
| 1440 // Emit value #'s for the fixed parameters. | 1440 // Emit value #'s for the fixed parameters. |
| 1441 for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) { | 1441 for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) { |
| 1442 // Check for labels (can happen with asm labels). | 1442 // Check for labels (can happen with asm labels). |
| 1443 if (FTy->getParamType(i)->isLabelTy()) | 1443 if (FTy->getParamType(i)->isLabelTy()) |
| 1444 Vals.push_back(VE.getValueID(CI.getArgOperand(i))); | 1444 Vals.push_back(VE.getValueID(CI.getArgOperand(i))); |
| 1445 else | 1445 else |
| 1446 pushValue(CI.getArgOperand(i), InstID, Vals, VE); // fixed param. | 1446 pushValue(CI.getArgOperand(i), InstID, Vals, VE); // fixed param. |
| 1447 } | 1447 } |
| 1448 | 1448 |
| 1449 // Emit type/value pairs for varargs params. | 1449 // Emit type/value pairs for varargs params. |
| 1450 if (FTy->isVarArg()) { | 1450 if (FTy->isVarArg()) { |
| 1451 for (unsigned i = FTy->getNumParams(), e = CI.getNumArgOperands(); | 1451 for (unsigned i = FTy->getNumParams(), e = CI.getNumArgOperands(); |
| 1452 i != e; ++i) | 1452 i != e; ++i) |
| 1453 PushValueAndType(CI.getArgOperand(i), InstID, Vals, VE); // varargs | 1453 PushValueAndType(CI.getArgOperand(i), InstID, Vals, VE); // varargs |
| 1454 } | 1454 } |
| 1455 break; | 1455 break; |
| 1456 } | 1456 } |
| 1457 case Instruction::VAArg: | 1457 case Instruction::VAArg: |
| 1458 Code = bitc::FUNC_CODE_INST_VAARG; | 1458 Code = naclbitc::FUNC_CODE_INST_VAARG; |
| 1459 Vals.push_back(VE.getTypeID(I.getOperand(0)->getType())); // valistty | 1459 Vals.push_back(VE.getTypeID(I.getOperand(0)->getType())); // valistty |
| 1460 pushValue(I.getOperand(0), InstID, Vals, VE); // valist. | 1460 pushValue(I.getOperand(0), InstID, Vals, VE); // valist. |
| 1461 Vals.push_back(VE.getTypeID(I.getType())); // restype. | 1461 Vals.push_back(VE.getTypeID(I.getType())); // restype. |
| 1462 break; | 1462 break; |
| 1463 } | 1463 } |
| 1464 | 1464 |
| 1465 Stream.EmitRecord(Code, Vals, AbbrevToUse); | 1465 Stream.EmitRecord(Code, Vals, AbbrevToUse); |
| 1466 Vals.clear(); | 1466 Vals.clear(); |
| 1467 } | 1467 } |
| 1468 | 1468 |
| 1469 // Emit names for globals/functions etc. | 1469 // Emit names for globals/functions etc. |
| 1470 static void WriteValueSymbolTable(const ValueSymbolTable &VST, | 1470 static void WriteValueSymbolTable(const ValueSymbolTable &VST, |
| 1471 const NaClValueEnumerator &VE, | 1471 const NaClValueEnumerator &VE, |
| 1472 NaClBitstreamWriter &Stream) { | 1472 NaClBitstreamWriter &Stream) { |
| 1473 if (VST.empty()) return; | 1473 if (VST.empty()) return; |
| 1474 Stream.EnterSubblock(bitc::VALUE_SYMTAB_BLOCK_ID, 4); | 1474 Stream.EnterSubblock(naclbitc::VALUE_SYMTAB_BLOCK_ID, 4); |
| 1475 | 1475 |
| 1476 // FIXME: Set up the abbrev, we know how many values there are! | 1476 // FIXME: Set up the abbrev, we know how many values there are! |
| 1477 // FIXME: We know if the type names can use 7-bit ascii. | 1477 // FIXME: We know if the type names can use 7-bit ascii. |
| 1478 SmallVector<unsigned, 64> NameVals; | 1478 SmallVector<unsigned, 64> NameVals; |
| 1479 | 1479 |
| 1480 for (ValueSymbolTable::const_iterator SI = VST.begin(), SE = VST.end(); | 1480 for (ValueSymbolTable::const_iterator SI = VST.begin(), SE = VST.end(); |
| 1481 SI != SE; ++SI) { | 1481 SI != SE; ++SI) { |
| 1482 | 1482 |
| 1483 const ValueName &Name = *SI; | 1483 const ValueName &Name = *SI; |
| 1484 | 1484 |
| 1485 // Figure out the encoding to use for the name. | 1485 // Figure out the encoding to use for the name. |
| 1486 bool is7Bit = true; | 1486 bool is7Bit = true; |
| 1487 bool isChar6 = true; | 1487 bool isChar6 = true; |
| 1488 for (const char *C = Name.getKeyData(), *E = C+Name.getKeyLength(); | 1488 for (const char *C = Name.getKeyData(), *E = C+Name.getKeyLength(); |
| 1489 C != E; ++C) { | 1489 C != E; ++C) { |
| 1490 if (isChar6) | 1490 if (isChar6) |
| 1491 isChar6 = BitCodeAbbrevOp::isChar6(*C); | 1491 isChar6 = BitCodeAbbrevOp::isChar6(*C); |
| 1492 if ((unsigned char)*C & 128) { | 1492 if ((unsigned char)*C & 128) { |
| 1493 is7Bit = false; | 1493 is7Bit = false; |
| 1494 break; // don't bother scanning the rest. | 1494 break; // don't bother scanning the rest. |
| 1495 } | 1495 } |
| 1496 } | 1496 } |
| 1497 | 1497 |
| 1498 unsigned AbbrevToUse = VST_ENTRY_8_ABBREV; | 1498 unsigned AbbrevToUse = VST_ENTRY_8_ABBREV; |
| 1499 | 1499 |
| 1500 // VST_ENTRY: [valueid, namechar x N] | 1500 // VST_ENTRY: [valueid, namechar x N] |
| 1501 // VST_BBENTRY: [bbid, namechar x N] | 1501 // VST_BBENTRY: [bbid, namechar x N] |
| 1502 unsigned Code; | 1502 unsigned Code; |
| 1503 if (isa<BasicBlock>(SI->getValue())) { | 1503 if (isa<BasicBlock>(SI->getValue())) { |
| 1504 Code = bitc::VST_CODE_BBENTRY; | 1504 Code = naclbitc::VST_CODE_BBENTRY; |
| 1505 if (isChar6) | 1505 if (isChar6) |
| 1506 AbbrevToUse = VST_BBENTRY_6_ABBREV; | 1506 AbbrevToUse = VST_BBENTRY_6_ABBREV; |
| 1507 } else { | 1507 } else { |
| 1508 Code = bitc::VST_CODE_ENTRY; | 1508 Code = naclbitc::VST_CODE_ENTRY; |
| 1509 if (isChar6) | 1509 if (isChar6) |
| 1510 AbbrevToUse = VST_ENTRY_6_ABBREV; | 1510 AbbrevToUse = VST_ENTRY_6_ABBREV; |
| 1511 else if (is7Bit) | 1511 else if (is7Bit) |
| 1512 AbbrevToUse = VST_ENTRY_7_ABBREV; | 1512 AbbrevToUse = VST_ENTRY_7_ABBREV; |
| 1513 } | 1513 } |
| 1514 | 1514 |
| 1515 NameVals.push_back(VE.getValueID(SI->getValue())); | 1515 NameVals.push_back(VE.getValueID(SI->getValue())); |
| 1516 for (const char *P = Name.getKeyData(), | 1516 for (const char *P = Name.getKeyData(), |
| 1517 *E = Name.getKeyData()+Name.getKeyLength(); P != E; ++P) | 1517 *E = Name.getKeyData()+Name.getKeyLength(); P != E; ++P) |
| 1518 NameVals.push_back((unsigned char)*P); | 1518 NameVals.push_back((unsigned char)*P); |
| 1519 | 1519 |
| 1520 // Emit the finished record. | 1520 // Emit the finished record. |
| 1521 Stream.EmitRecord(Code, NameVals, AbbrevToUse); | 1521 Stream.EmitRecord(Code, NameVals, AbbrevToUse); |
| 1522 NameVals.clear(); | 1522 NameVals.clear(); |
| 1523 } | 1523 } |
| 1524 Stream.ExitBlock(); | 1524 Stream.ExitBlock(); |
| 1525 } | 1525 } |
| 1526 | 1526 |
| 1527 /// WriteFunction - Emit a function body to the module stream. | 1527 /// WriteFunction - Emit a function body to the module stream. |
| 1528 static void WriteFunction(const Function &F, NaClValueEnumerator &VE, | 1528 static void WriteFunction(const Function &F, NaClValueEnumerator &VE, |
| 1529 NaClBitstreamWriter &Stream) { | 1529 NaClBitstreamWriter &Stream) { |
| 1530 Stream.EnterSubblock(bitc::FUNCTION_BLOCK_ID, 4); | 1530 Stream.EnterSubblock(naclbitc::FUNCTION_BLOCK_ID, 4); |
| 1531 VE.incorporateFunction(F); | 1531 VE.incorporateFunction(F); |
| 1532 | 1532 |
| 1533 SmallVector<unsigned, 64> Vals; | 1533 SmallVector<unsigned, 64> Vals; |
| 1534 | 1534 |
| 1535 // Emit the number of basic blocks, so the reader can create them ahead of | 1535 // Emit the number of basic blocks, so the reader can create them ahead of |
| 1536 // time. | 1536 // time. |
| 1537 Vals.push_back(VE.getBasicBlocks().size()); | 1537 Vals.push_back(VE.getBasicBlocks().size()); |
| 1538 Stream.EmitRecord(bitc::FUNC_CODE_DECLAREBLOCKS, Vals); | 1538 Stream.EmitRecord(naclbitc::FUNC_CODE_DECLAREBLOCKS, Vals); |
| 1539 Vals.clear(); | 1539 Vals.clear(); |
| 1540 | 1540 |
| 1541 // If there are function-local constants, emit them now. | 1541 // If there are function-local constants, emit them now. |
| 1542 unsigned CstStart, CstEnd; | 1542 unsigned CstStart, CstEnd; |
| 1543 VE.getFunctionConstantRange(CstStart, CstEnd); | 1543 VE.getFunctionConstantRange(CstStart, CstEnd); |
| 1544 WriteConstants(CstStart, CstEnd, VE, Stream, false); | 1544 WriteConstants(CstStart, CstEnd, VE, Stream, false); |
| 1545 | 1545 |
| 1546 // If there is function-local metadata, emit it now. | 1546 // If there is function-local metadata, emit it now. |
| 1547 WriteFunctionLocalMetadata(F, VE, Stream); | 1547 WriteFunctionLocalMetadata(F, VE, Stream); |
| 1548 | 1548 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1564 | 1564 |
| 1565 // If the instruction has metadata, write a metadata attachment later. | 1565 // If the instruction has metadata, write a metadata attachment later. |
| 1566 NeedsMetadataAttachment |= I->hasMetadataOtherThanDebugLoc(); | 1566 NeedsMetadataAttachment |= I->hasMetadataOtherThanDebugLoc(); |
| 1567 | 1567 |
| 1568 // If the instruction has a debug location, emit it. | 1568 // If the instruction has a debug location, emit it. |
| 1569 DebugLoc DL = I->getDebugLoc(); | 1569 DebugLoc DL = I->getDebugLoc(); |
| 1570 if (DL.isUnknown()) { | 1570 if (DL.isUnknown()) { |
| 1571 // nothing todo. | 1571 // nothing todo. |
| 1572 } else if (DL == LastDL) { | 1572 } else if (DL == LastDL) { |
| 1573 // Just repeat the same debug loc as last time. | 1573 // Just repeat the same debug loc as last time. |
| 1574 Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC_AGAIN, Vals); | 1574 Stream.EmitRecord(naclbitc::FUNC_CODE_DEBUG_LOC_AGAIN, Vals); |
| 1575 } else { | 1575 } else { |
| 1576 MDNode *Scope, *IA; | 1576 MDNode *Scope, *IA; |
| 1577 DL.getScopeAndInlinedAt(Scope, IA, I->getContext()); | 1577 DL.getScopeAndInlinedAt(Scope, IA, I->getContext()); |
| 1578 | 1578 |
| 1579 Vals.push_back(DL.getLine()); | 1579 Vals.push_back(DL.getLine()); |
| 1580 Vals.push_back(DL.getCol()); | 1580 Vals.push_back(DL.getCol()); |
| 1581 Vals.push_back(Scope ? VE.getValueID(Scope)+1 : 0); | 1581 Vals.push_back(Scope ? VE.getValueID(Scope)+1 : 0); |
| 1582 Vals.push_back(IA ? VE.getValueID(IA)+1 : 0); | 1582 Vals.push_back(IA ? VE.getValueID(IA)+1 : 0); |
| 1583 Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC, Vals); | 1583 Stream.EmitRecord(naclbitc::FUNC_CODE_DEBUG_LOC, Vals); |
| 1584 Vals.clear(); | 1584 Vals.clear(); |
| 1585 | 1585 |
| 1586 LastDL = DL; | 1586 LastDL = DL; |
| 1587 } | 1587 } |
| 1588 } | 1588 } |
| 1589 | 1589 |
| 1590 // Emit names for all the instructions etc. | 1590 // Emit names for all the instructions etc. |
| 1591 WriteValueSymbolTable(F.getValueSymbolTable(), VE, Stream); | 1591 WriteValueSymbolTable(F.getValueSymbolTable(), VE, Stream); |
| 1592 | 1592 |
| 1593 if (NeedsMetadataAttachment) | 1593 if (NeedsMetadataAttachment) |
| 1594 WriteMetadataAttachment(F, VE, Stream); | 1594 WriteMetadataAttachment(F, VE, Stream); |
| 1595 VE.purgeFunction(); | 1595 VE.purgeFunction(); |
| 1596 Stream.ExitBlock(); | 1596 Stream.ExitBlock(); |
| 1597 } | 1597 } |
| 1598 | 1598 |
| 1599 // Emit blockinfo, which defines the standard abbreviations etc. | 1599 // Emit blockinfo, which defines the standard abbreviations etc. |
| 1600 static void WriteBlockInfo(const NaClValueEnumerator &VE, NaClBitstreamWriter &S
tream) { | 1600 static void WriteBlockInfo(const NaClValueEnumerator &VE, NaClBitstreamWriter &S
tream) { |
| 1601 // We only want to emit block info records for blocks that have multiple | 1601 // We only want to emit block info records for blocks that have multiple |
| 1602 // instances: CONSTANTS_BLOCK, FUNCTION_BLOCK and VALUE_SYMTAB_BLOCK. | 1602 // instances: CONSTANTS_BLOCK, FUNCTION_BLOCK and VALUE_SYMTAB_BLOCK. |
| 1603 // Other blocks can define their abbrevs inline. | 1603 // Other blocks can define their abbrevs inline. |
| 1604 Stream.EnterBlockInfoBlock(2); | 1604 Stream.EnterBlockInfoBlock(2); |
| 1605 | 1605 |
| 1606 { // 8-bit fixed-width VST_ENTRY/VST_BBENTRY strings. | 1606 { // 8-bit fixed-width VST_ENTRY/VST_BBENTRY strings. |
| 1607 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 1607 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 1608 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); | 1608 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); |
| 1609 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); | 1609 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); |
| 1610 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); | 1610 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); |
| 1611 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); | 1611 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); |
| 1612 if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID, | 1612 if (Stream.EmitBlockInfoAbbrev(naclbitc::VALUE_SYMTAB_BLOCK_ID, |
| 1613 Abbv) != VST_ENTRY_8_ABBREV) | 1613 Abbv) != VST_ENTRY_8_ABBREV) |
| 1614 llvm_unreachable("Unexpected abbrev ordering!"); | 1614 llvm_unreachable("Unexpected abbrev ordering!"); |
| 1615 } | 1615 } |
| 1616 | 1616 |
| 1617 { // 7-bit fixed width VST_ENTRY strings. | 1617 { // 7-bit fixed width VST_ENTRY strings. |
| 1618 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 1618 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 1619 Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_ENTRY)); | 1619 Abbv->Add(BitCodeAbbrevOp(naclbitc::VST_CODE_ENTRY)); |
| 1620 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); | 1620 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); |
| 1621 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); | 1621 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); |
| 1622 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); | 1622 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); |
| 1623 if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID, | 1623 if (Stream.EmitBlockInfoAbbrev(naclbitc::VALUE_SYMTAB_BLOCK_ID, |
| 1624 Abbv) != VST_ENTRY_7_ABBREV) | 1624 Abbv) != VST_ENTRY_7_ABBREV) |
| 1625 llvm_unreachable("Unexpected abbrev ordering!"); | 1625 llvm_unreachable("Unexpected abbrev ordering!"); |
| 1626 } | 1626 } |
| 1627 { // 6-bit char6 VST_ENTRY strings. | 1627 { // 6-bit char6 VST_ENTRY strings. |
| 1628 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 1628 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 1629 Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_ENTRY)); | 1629 Abbv->Add(BitCodeAbbrevOp(naclbitc::VST_CODE_ENTRY)); |
| 1630 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); | 1630 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); |
| 1631 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); | 1631 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); |
| 1632 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); | 1632 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); |
| 1633 if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID, | 1633 if (Stream.EmitBlockInfoAbbrev(naclbitc::VALUE_SYMTAB_BLOCK_ID, |
| 1634 Abbv) != VST_ENTRY_6_ABBREV) | 1634 Abbv) != VST_ENTRY_6_ABBREV) |
| 1635 llvm_unreachable("Unexpected abbrev ordering!"); | 1635 llvm_unreachable("Unexpected abbrev ordering!"); |
| 1636 } | 1636 } |
| 1637 { // 6-bit char6 VST_BBENTRY strings. | 1637 { // 6-bit char6 VST_BBENTRY strings. |
| 1638 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 1638 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 1639 Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_BBENTRY)); | 1639 Abbv->Add(BitCodeAbbrevOp(naclbitc::VST_CODE_BBENTRY)); |
| 1640 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); | 1640 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); |
| 1641 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); | 1641 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); |
| 1642 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); | 1642 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); |
| 1643 if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID, | 1643 if (Stream.EmitBlockInfoAbbrev(naclbitc::VALUE_SYMTAB_BLOCK_ID, |
| 1644 Abbv) != VST_BBENTRY_6_ABBREV) | 1644 Abbv) != VST_BBENTRY_6_ABBREV) |
| 1645 llvm_unreachable("Unexpected abbrev ordering!"); | 1645 llvm_unreachable("Unexpected abbrev ordering!"); |
| 1646 } | 1646 } |
| 1647 | 1647 |
| 1648 | 1648 |
| 1649 | 1649 |
| 1650 { // SETTYPE abbrev for CONSTANTS_BLOCK. | 1650 { // SETTYPE abbrev for CONSTANTS_BLOCK. |
| 1651 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 1651 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 1652 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_SETTYPE)); | 1652 Abbv->Add(BitCodeAbbrevOp(naclbitc::CST_CODE_SETTYPE)); |
| 1653 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, | 1653 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, |
| 1654 Log2_32_Ceil(VE.getTypes().size()+1))); | 1654 Log2_32_Ceil(VE.getTypes().size()+1))); |
| 1655 if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, | 1655 if (Stream.EmitBlockInfoAbbrev(naclbitc::CONSTANTS_BLOCK_ID, |
| 1656 Abbv) != CONSTANTS_SETTYPE_ABBREV) | 1656 Abbv) != CONSTANTS_SETTYPE_ABBREV) |
| 1657 llvm_unreachable("Unexpected abbrev ordering!"); | 1657 llvm_unreachable("Unexpected abbrev ordering!"); |
| 1658 } | 1658 } |
| 1659 | 1659 |
| 1660 { // INTEGER abbrev for CONSTANTS_BLOCK. | 1660 { // INTEGER abbrev for CONSTANTS_BLOCK. |
| 1661 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 1661 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 1662 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_INTEGER)); | 1662 Abbv->Add(BitCodeAbbrevOp(naclbitc::CST_CODE_INTEGER)); |
| 1663 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); | 1663 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); |
| 1664 if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, | 1664 if (Stream.EmitBlockInfoAbbrev(naclbitc::CONSTANTS_BLOCK_ID, |
| 1665 Abbv) != CONSTANTS_INTEGER_ABBREV) | 1665 Abbv) != CONSTANTS_INTEGER_ABBREV) |
| 1666 llvm_unreachable("Unexpected abbrev ordering!"); | 1666 llvm_unreachable("Unexpected abbrev ordering!"); |
| 1667 } | 1667 } |
| 1668 | 1668 |
| 1669 { // CE_CAST abbrev for CONSTANTS_BLOCK. | 1669 { // CE_CAST abbrev for CONSTANTS_BLOCK. |
| 1670 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 1670 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 1671 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_CE_CAST)); | 1671 Abbv->Add(BitCodeAbbrevOp(naclbitc::CST_CODE_CE_CAST)); |
| 1672 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // cast opc | 1672 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // cast opc |
| 1673 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, // typeid | 1673 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, // typeid |
| 1674 Log2_32_Ceil(VE.getTypes().size()+1))); | 1674 Log2_32_Ceil(VE.getTypes().size()+1))); |
| 1675 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // value id | 1675 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // value id |
| 1676 | 1676 |
| 1677 if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, | 1677 if (Stream.EmitBlockInfoAbbrev(naclbitc::CONSTANTS_BLOCK_ID, |
| 1678 Abbv) != CONSTANTS_CE_CAST_Abbrev) | 1678 Abbv) != CONSTANTS_CE_CAST_Abbrev) |
| 1679 llvm_unreachable("Unexpected abbrev ordering!"); | 1679 llvm_unreachable("Unexpected abbrev ordering!"); |
| 1680 } | 1680 } |
| 1681 { // NULL abbrev for CONSTANTS_BLOCK. | 1681 { // NULL abbrev for CONSTANTS_BLOCK. |
| 1682 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 1682 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 1683 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_NULL)); | 1683 Abbv->Add(BitCodeAbbrevOp(naclbitc::CST_CODE_NULL)); |
| 1684 if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, | 1684 if (Stream.EmitBlockInfoAbbrev(naclbitc::CONSTANTS_BLOCK_ID, |
| 1685 Abbv) != CONSTANTS_NULL_Abbrev) | 1685 Abbv) != CONSTANTS_NULL_Abbrev) |
| 1686 llvm_unreachable("Unexpected abbrev ordering!"); | 1686 llvm_unreachable("Unexpected abbrev ordering!"); |
| 1687 } | 1687 } |
| 1688 | 1688 |
| 1689 // FIXME: This should only use space for first class types! | 1689 // FIXME: This should only use space for first class types! |
| 1690 | 1690 |
| 1691 { // INST_LOAD abbrev for FUNCTION_BLOCK. | 1691 { // INST_LOAD abbrev for FUNCTION_BLOCK. |
| 1692 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 1692 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 1693 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_LOAD)); | 1693 Abbv->Add(BitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_LOAD)); |
| 1694 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Ptr | 1694 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Ptr |
| 1695 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // Align | 1695 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // Align |
| 1696 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // volatile | 1696 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // volatile |
| 1697 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, | 1697 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID, |
| 1698 Abbv) != FUNCTION_INST_LOAD_ABBREV) | 1698 Abbv) != FUNCTION_INST_LOAD_ABBREV) |
| 1699 llvm_unreachable("Unexpected abbrev ordering!"); | 1699 llvm_unreachable("Unexpected abbrev ordering!"); |
| 1700 } | 1700 } |
| 1701 { // INST_BINOP abbrev for FUNCTION_BLOCK. | 1701 { // INST_BINOP abbrev for FUNCTION_BLOCK. |
| 1702 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 1702 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 1703 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_BINOP)); | 1703 Abbv->Add(BitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_BINOP)); |
| 1704 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LHS | 1704 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LHS |
| 1705 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // RHS | 1705 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // RHS |
| 1706 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc | 1706 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc |
| 1707 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, | 1707 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID, |
| 1708 Abbv) != FUNCTION_INST_BINOP_ABBREV) | 1708 Abbv) != FUNCTION_INST_BINOP_ABBREV) |
| 1709 llvm_unreachable("Unexpected abbrev ordering!"); | 1709 llvm_unreachable("Unexpected abbrev ordering!"); |
| 1710 } | 1710 } |
| 1711 { // INST_BINOP_FLAGS abbrev for FUNCTION_BLOCK. | 1711 { // INST_BINOP_FLAGS abbrev for FUNCTION_BLOCK. |
| 1712 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 1712 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 1713 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_BINOP)); | 1713 Abbv->Add(BitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_BINOP)); |
| 1714 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LHS | 1714 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LHS |
| 1715 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // RHS | 1715 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // RHS |
| 1716 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc | 1716 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc |
| 1717 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); // flags | 1717 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); // flags |
| 1718 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, | 1718 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID, |
| 1719 Abbv) != FUNCTION_INST_BINOP_FLAGS_ABBREV) | 1719 Abbv) != FUNCTION_INST_BINOP_FLAGS_ABBREV) |
| 1720 llvm_unreachable("Unexpected abbrev ordering!"); | 1720 llvm_unreachable("Unexpected abbrev ordering!"); |
| 1721 } | 1721 } |
| 1722 { // INST_CAST abbrev for FUNCTION_BLOCK. | 1722 { // INST_CAST abbrev for FUNCTION_BLOCK. |
| 1723 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 1723 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 1724 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_CAST)); | 1724 Abbv->Add(BitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_CAST)); |
| 1725 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // OpVal | 1725 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // OpVal |
| 1726 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, // dest ty | 1726 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, // dest ty |
| 1727 Log2_32_Ceil(VE.getTypes().size()+1))); | 1727 Log2_32_Ceil(VE.getTypes().size()+1))); |
| 1728 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc | 1728 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc |
| 1729 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, | 1729 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID, |
| 1730 Abbv) != FUNCTION_INST_CAST_ABBREV) | 1730 Abbv) != FUNCTION_INST_CAST_ABBREV) |
| 1731 llvm_unreachable("Unexpected abbrev ordering!"); | 1731 llvm_unreachable("Unexpected abbrev ordering!"); |
| 1732 } | 1732 } |
| 1733 | 1733 |
| 1734 { // INST_RET abbrev for FUNCTION_BLOCK. | 1734 { // INST_RET abbrev for FUNCTION_BLOCK. |
| 1735 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 1735 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 1736 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_RET)); | 1736 Abbv->Add(BitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_RET)); |
| 1737 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, | 1737 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID, |
| 1738 Abbv) != FUNCTION_INST_RET_VOID_ABBREV) | 1738 Abbv) != FUNCTION_INST_RET_VOID_ABBREV) |
| 1739 llvm_unreachable("Unexpected abbrev ordering!"); | 1739 llvm_unreachable("Unexpected abbrev ordering!"); |
| 1740 } | 1740 } |
| 1741 { // INST_RET abbrev for FUNCTION_BLOCK. | 1741 { // INST_RET abbrev for FUNCTION_BLOCK. |
| 1742 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 1742 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 1743 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_RET)); | 1743 Abbv->Add(BitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_RET)); |
| 1744 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ValID | 1744 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ValID |
| 1745 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, | 1745 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID, |
| 1746 Abbv) != FUNCTION_INST_RET_VAL_ABBREV) | 1746 Abbv) != FUNCTION_INST_RET_VAL_ABBREV) |
| 1747 llvm_unreachable("Unexpected abbrev ordering!"); | 1747 llvm_unreachable("Unexpected abbrev ordering!"); |
| 1748 } | 1748 } |
| 1749 { // INST_UNREACHABLE abbrev for FUNCTION_BLOCK. | 1749 { // INST_UNREACHABLE abbrev for FUNCTION_BLOCK. |
| 1750 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 1750 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 1751 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_UNREACHABLE)); | 1751 Abbv->Add(BitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_UNREACHABLE)); |
| 1752 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, | 1752 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID, |
| 1753 Abbv) != FUNCTION_INST_UNREACHABLE_ABBREV) | 1753 Abbv) != FUNCTION_INST_UNREACHABLE_ABBREV) |
| 1754 llvm_unreachable("Unexpected abbrev ordering!"); | 1754 llvm_unreachable("Unexpected abbrev ordering!"); |
| 1755 } | 1755 } |
| 1756 | 1756 |
| 1757 Stream.ExitBlock(); | 1757 Stream.ExitBlock(); |
| 1758 } | 1758 } |
| 1759 | 1759 |
| 1760 /// WriteModule - Emit the specified module to the bitstream. | 1760 /// WriteModule - Emit the specified module to the bitstream. |
| 1761 static void WriteModule(const Module *M, NaClBitstreamWriter &Stream) { | 1761 static void WriteModule(const Module *M, NaClBitstreamWriter &Stream) { |
| 1762 Stream.EnterSubblock(bitc::MODULE_BLOCK_ID, 3); | 1762 Stream.EnterSubblock(naclbitc::MODULE_BLOCK_ID, 3); |
| 1763 | 1763 |
| 1764 SmallVector<unsigned, 1> Vals; | 1764 SmallVector<unsigned, 1> Vals; |
| 1765 unsigned CurVersion = 1; | 1765 unsigned CurVersion = 1; |
| 1766 Vals.push_back(CurVersion); | 1766 Vals.push_back(CurVersion); |
| 1767 Stream.EmitRecord(bitc::MODULE_CODE_VERSION, Vals); | 1767 Stream.EmitRecord(naclbitc::MODULE_CODE_VERSION, Vals); |
| 1768 | 1768 |
| 1769 // Analyze the module, enumerating globals, functions, etc. | 1769 // Analyze the module, enumerating globals, functions, etc. |
| 1770 NaClValueEnumerator VE(M); | 1770 NaClValueEnumerator VE(M); |
| 1771 | 1771 |
| 1772 // Emit blockinfo, which defines the standard abbreviations etc. | 1772 // Emit blockinfo, which defines the standard abbreviations etc. |
| 1773 WriteBlockInfo(VE, Stream); | 1773 WriteBlockInfo(VE, Stream); |
| 1774 | 1774 |
| 1775 // Emit information about attribute groups. | 1775 // Emit information about attribute groups. |
| 1776 WriteAttributeGroupTable(VE, Stream); | 1776 WriteAttributeGroupTable(VE, Stream); |
| 1777 | 1777 |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1908 // Emit the module. | 1908 // Emit the module. |
| 1909 WriteModule(M, Stream); | 1909 WriteModule(M, Stream); |
| 1910 } | 1910 } |
| 1911 | 1911 |
| 1912 if (TT.isOSDarwin()) | 1912 if (TT.isOSDarwin()) |
| 1913 EmitDarwinBCHeaderAndTrailer(Buffer, TT); | 1913 EmitDarwinBCHeaderAndTrailer(Buffer, TT); |
| 1914 | 1914 |
| 1915 // Write the generated bitstream to "Out". | 1915 // Write the generated bitstream to "Out". |
| 1916 Out.write((char*)&Buffer.front(), Buffer.size()); | 1916 Out.write((char*)&Buffer.front(), Buffer.size()); |
| 1917 } | 1917 } |
| OLD | NEW |