 Chromium Code Reviews
 Chromium Code Reviews Issue 154603002:
  Make pnacl-bccompress add abbreviations for obvious constants.  (Closed) 
  Base URL: http://git.chromium.org/native_client/pnacl-llvm.git@master
    
  
    Issue 154603002:
  Make pnacl-bccompress add abbreviations for obvious constants.  (Closed) 
  Base URL: http://git.chromium.org/native_client/pnacl-llvm.git@master| Index: lib/Bitcode/NaCl/Reader/NaClBitCodes.cpp | 
| diff --git a/lib/Bitcode/NaCl/Reader/NaClBitCodes.cpp b/lib/Bitcode/NaCl/Reader/NaClBitCodes.cpp | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..a0e31f16d68d55fa6551167ebceceea005495dd7 | 
| --- /dev/null | 
| +++ b/lib/Bitcode/NaCl/Reader/NaClBitCodes.cpp | 
| @@ -0,0 +1,95 @@ | 
| +//===- NaClBitcodeHeader.cpp ----------------------------------------------===// | 
| +// PNaCl bitcode header reader. | 
| +// | 
| +// The LLVM Compiler Infrastructure | 
| +// | 
| +// This file is distributed under the University of Illinois Open Source | 
| +// License. See LICENSE.TXT for details. | 
| +// | 
| +//===----------------------------------------------------------------------===// | 
| +// | 
| +// Implementation of Bitcode abbrevations. | 
| +// | 
| +//===----------------------------------------------------------------------===// | 
| + | 
| +#include "llvm/Bitcode/NaCl/NaClBitCodes.h" | 
| +#include "llvm/Support/raw_ostream.h" | 
| + | 
| +using namespace llvm; | 
| + | 
| +void NaClBitCodeAbbrevOp::Print(raw_ostream& Stream) const { | 
| + if (isLiteral()) { | 
| + Stream << getLiteralValue(); | 
| + } else if (isEncoding()) { | 
| + switch (getEncoding()) { | 
| + case Fixed: | 
| + Stream << "Fixed(" << getEncodingData() << ")"; | 
| + break; | 
| + case VBR: | 
| + Stream << "VBR(" << getEncodingData() << ")"; | 
| + break; | 
| + case Array: | 
| + Stream << "Array"; | 
| + break; | 
| + case Char6: | 
| + Stream << "Char6"; | 
| + break; | 
| + case Blob: | 
| + Stream << "Blob"; | 
| + break; | 
| + default: | 
| + assert(false); | 
| 
jvoung (off chromium)
2014/02/07 21:34:10
llvm_unreachable("...") instead ?
 
Karl
2014/02/07 23:26:04
Done.
 | 
| + Stream << "??"; // In case asserts are turned off. | 
| + break; | 
| + } | 
| + } else { | 
| + assert(false); | 
| + Stream << "??"; // In case asserts are turned off. | 
| + } | 
| +} | 
| + | 
| +static void PrintExpression(raw_ostream &Stream, | 
| + const NaClBitCodeAbbrev *Abbrev, | 
| + unsigned &Index) { | 
| + // Bail out early, in case we are incrementally building the | 
| + // expression and the argument is not available yet. | 
| + if (Index >= Abbrev->getNumOperandInfos()) return; | 
| + | 
| + const NaClBitCodeAbbrevOp &Op = Abbrev->getOperandInfo(Index); | 
| + Op.Print(Stream); | 
| + if (unsigned NumArgs = Op.NumArguments()) { | 
| + Stream << "("; | 
| + for (unsigned i = 0; i < NumArgs; ++i) { | 
| + ++Index; | 
| + if (i > 0) Stream << ","; | 
| + PrintExpression(Stream, Abbrev, Index); | 
| + } | 
| + Stream << ")"; | 
| + } | 
| +} | 
| + | 
| +void NaClBitCodeAbbrev::Print(raw_ostream &Stream) const { | 
| + Stream << "["; | 
| + for (unsigned i = 0; i < getNumOperandInfos(); ++i) { | 
| + if (i > 0) Stream << ", "; | 
| + PrintExpression(Stream, this, i); | 
| + } | 
| + Stream << "]\n"; | 
| +} | 
| + | 
| +NaClBitCodeAbbrev *NaClBitCodeAbbrev::Simplify() const { | 
| + NaClBitCodeAbbrev *Abbrev = new NaClBitCodeAbbrev(); | 
| + for (unsigned i = 0; i < OperandList.size(); ++i) { | 
| + const NaClBitCodeAbbrevOp &Op = OperandList[i]; | 
| + // Simplify if possible. Currently, the only simplification known | 
| + // is to remove unnecessary operands appearing immediately before an | 
| + // array operator. That is, apply the simplification: | 
| + // Op Array(Op) -> Array(Op) | 
| 
jvoung (off chromium)
2014/02/07 21:34:10
perhaps check if that the abbrev is well formed:
 
Karl
2014/02/07 23:26:04
Done.
 | 
| + while (Op.isArrayOp() && !Abbrev->OperandList.empty() && | 
| + Abbrev->OperandList.back() == OperandList[i+1]) { | 
| + Abbrev->OperandList.pop_back(); | 
| + } | 
| + Abbrev->OperandList.push_back(Op); | 
| + } | 
| + return Abbrev; | 
| +} |