| Index: lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp
|
| diff --git a/lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp b/lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp
|
| index 1d7d8dc23c94c02b098db1abc58f68c618d3a480..2e318020adbafb874b77dc8de54ef18ca5f41114 100644
|
| --- a/lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp
|
| +++ b/lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp
|
| @@ -233,12 +233,22 @@ static void WriteTypeTable(const NaClValueEnumerator &VE,
|
| 4 /*count from # abbrevs */);
|
| SmallVector<uint64_t, 64> TypeVals;
|
|
|
| + // Note: modify to use maximum number of bits if under cutoff. Otherwise,
|
| + // use VBR to take advantage that frequently referenced types have
|
| + // small IDs.
|
| + //
|
| + // Note: Cutoff chosen based on experiments on pnacl-translate.pexe.
|
| uint64_t NumBits = Log2_32_Ceil(VE.getTypes().size()+1);
|
| + static const uint64_t TypeVBRCutoff = 6;
|
| + uint64_t TypeIdNumBits = (NumBits <= TypeVBRCutoff ? NumBits : TypeVBRCutoff);
|
| + NaClBitCodeAbbrevOp::Encoding TypeIdEncoding =
|
| + (NumBits <= TypeVBRCutoff
|
| + ? NaClBitCodeAbbrevOp::Fixed : NaClBitCodeAbbrevOp::VBR);
|
|
|
| // Abbrev for TYPE_CODE_POINTER.
|
| NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
|
| Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::TYPE_CODE_POINTER));
|
| - Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, NumBits));
|
| + Abbv->Add(NaClBitCodeAbbrevOp(TypeIdEncoding, TypeIdNumBits));
|
| Abbv->Add(NaClBitCodeAbbrevOp(0)); // Addrspace = 0
|
| unsigned PtrAbbrev = Stream.EmitAbbrev(Abbv);
|
|
|
| @@ -247,7 +257,7 @@ static void WriteTypeTable(const NaClValueEnumerator &VE,
|
| Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::TYPE_CODE_FUNCTION));
|
| Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 1)); // isvararg
|
| Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
|
| - Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, NumBits));
|
| + Abbv->Add(NaClBitCodeAbbrevOp(TypeIdEncoding, TypeIdNumBits));
|
|
|
| unsigned FunctionAbbrev = Stream.EmitAbbrev(Abbv);
|
|
|
| @@ -256,7 +266,7 @@ static void WriteTypeTable(const NaClValueEnumerator &VE,
|
| Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::TYPE_CODE_STRUCT_ANON));
|
| Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 1)); // ispacked
|
| Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
|
| - Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, NumBits));
|
| + Abbv->Add(NaClBitCodeAbbrevOp(TypeIdEncoding, TypeIdNumBits));
|
|
|
| unsigned StructAnonAbbrev = Stream.EmitAbbrev(Abbv);
|
|
|
| @@ -272,7 +282,7 @@ static void WriteTypeTable(const NaClValueEnumerator &VE,
|
| Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::TYPE_CODE_STRUCT_NAMED));
|
| Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 1)); // ispacked
|
| Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
|
| - Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, NumBits));
|
| + Abbv->Add(NaClBitCodeAbbrevOp(TypeIdEncoding, TypeIdNumBits));
|
|
|
| unsigned StructNamedAbbrev = Stream.EmitAbbrev(Abbv);
|
|
|
| @@ -280,7 +290,7 @@ static void WriteTypeTable(const NaClValueEnumerator &VE,
|
| Abbv = new NaClBitCodeAbbrev();
|
| Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::TYPE_CODE_ARRAY));
|
| Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 8)); // size
|
| - Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, NumBits));
|
| + Abbv->Add(NaClBitCodeAbbrevOp(TypeIdEncoding, TypeIdNumBits));
|
|
|
| unsigned ArrayAbbrev = Stream.EmitAbbrev(Abbv);
|
|
|
|
|