Thanks for the review Duncan!<div><br><div>Yes, on second thought, it would be simpler (less bookkeeping)</div><div>if this was toggled at the module level (but I haven't looked into</div><div>how that would be done).  I had done it at the function level</div>


<div>to begin with because it affected only the function bodies,</div><div>so it would be more obvious what changed.  Anyone have a</div><div>stronger feeling (or a reason!) why it would be better to do this at</div><div>
a per-function vs per-module basis?</div>
<div><br></div><div>I'll look into how to do it at the module level and send out a new</div><div>patch later + with your comments addressed.</div><div><br></div><div><div class="gmail_extra"><br><div class="gmail_quote">


On Wed, Sep 26, 2012 at 1:31 AM, Duncan Sands <span dir="ltr"><<a href="mailto:baldrick@free.fr" target="_blank">baldrick@free.fr</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Hi Jan,<div><br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
I've been looking into how to make llvm bitcode files smaller.  There is one<br>
simple change that appears to shrink linked bitcode files by about 15%.  See<br>
this spreadsheet for some rough data:<br>
<br>
<a href="https://docs.google.com/spreadsheet/ccc?key=0AjRrJHQc4_bddEtJdjdIek5fMDdIdFFIZldZXzdWa0E" target="_blank">https://docs.google.com/<u></u>spreadsheet/ccc?key=<u></u>0AjRrJHQc4_<u></u>bddEtJdjdIek5fMDdIdFFIZldZXzdW<u></u>a0E</a><br>





</blockquote>
<br></div>
the improvement is wonderful!<br>
<br>
...<div><br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
In any case, the patch is attached if there is interest...  If you want to try<br>
out the patch, you can toggle between the new and old encoding by using the flag<br>
"-enable-old-style-functions" vs no flags, with llvm-as.<br>
</blockquote>
<br></div>
I don't know anything much about the bitcode representation, but anyway:<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
diff --git a/include/llvm/Bitcode/<u></u>BitstreamReader.h b/include/llvm/Bitcode/<u></u>BitstreamReader.h<br>
index 3daef78..840f57e 100644<br>
--- a/include/llvm/Bitcode/<u></u>BitstreamReader.h<br>
+++ b/include/llvm/Bitcode/<u></u>BitstreamReader.h<br>
@@ -409,7 +409,7 @@ public:<br>
   }<br>
<br>
   /// EnterSubBlock - Having read the ENTER_SUBBLOCK abbrevid, enter<br>
-  /// the block, and return true if the block is valid.<br>
+  /// the block, and return true if the block has an error.<br>
   bool EnterSubBlock(unsigned BlockID, unsigned *NumWordsP = 0) {<br>
     // Save the current block's state on BlockScope.<br>
     BlockScope.push_back(Block(<u></u>CurCodeSize));<br>
diff --git a/include/llvm/Bitcode/<u></u>LLVMBitCodes.h b/include/llvm/Bitcode/<u></u>LLVMBitCodes.h<br>
index c1dc190..6c81739 100644<br>
--- a/include/llvm/Bitcode/<u></u>LLVMBitCodes.h<br>
+++ b/include/llvm/Bitcode/<u></u>LLVMBitCodes.h<br>
@@ -33,9 +33,9 @@ namespace bitc {<br>
     UNUSED_ID1,<br>
<br>
     CONSTANTS_BLOCK_ID,<br>
-    FUNCTION_BLOCK_ID,<br>
+    FUNCTION_BLOCK_ID,  // Deprecated in favor of FUNCTION_BLOCK_ID_REL<br>
</blockquote>
<br>
FUNCTION_BLOCK_ID_REL -> FUNCTION_BLOCK_REL_ID<br>
<br>
Is there any point in having this on a per-function basis, why not have it be<br>
per-module?<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
-    UNUSED_ID2,<br>
+    FUNCTION_BLOCK_REL_ID,<br>
<br>
     VALUE_SYMTAB_BLOCK_ID,<br>
     METADATA_BLOCK_ID,<br>
@@ -257,8 +257,9 @@ namespace bitc {<br>
     SYNCHSCOPE_CROSSTHREAD = 1<br>
   };<br>
<br>
-  // The function body block (FUNCTION_BLOCK_ID) describes function bodies.  It<br>
-  // can contain a constant block (CONSTANTS_BLOCK_ID).<br>
+  // The function body block (FUNCTION_BLOCK_ID and FUNCTION_BLOCK_REL_ID)<br>
+  // describes function bodies.  It can contain a constant block<br>
+  // (CONSTANTS_BLOCK_ID).<br>
   enum FunctionCodes {<br>
     FUNC_CODE_DECLAREBLOCKS    =  1, // DECLAREBLOCKS: [n]<br>
<br>
diff --git a/lib/Bitcode/Reader/<u></u>BitcodeReader.cpp b/lib/Bitcode/Reader/<u></u>BitcodeReader.cpp<br>
index b69a362..5fd3dfd 100644<br>
--- a/lib/Bitcode/Reader/<u></u>BitcodeReader.cpp<br>
+++ b/lib/Bitcode/Reader/<u></u>BitcodeReader.cpp<br>
</blockquote>
...<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
@@ -1495,6 +1497,12 @@ bool BitcodeReader::ParseModule(<u></u>bool Resume) {<br>
           SeenFirstFunctionBody = true;<br>
         }<br>
<br>
+        // Remember the encoding style for the function.<br>
+        if (FunctionsWithBodies.empty())<br>
+          return Error("Insufficient function protos");<br>
</blockquote>
<br>
Why this new error?  Or would it have occurred anyway, later?  Maybe it<br>
should be an assertion, if it should be impossible.  I think "prototypes"<br>
would be better than "protos".<br></blockquote><div><br></div><div>Yes, it would have occurred later (originally).  I had copied this check from</div><div>the "RememberAndSkipFunctionBody()" function, as a quick way</div>

<div>to test this out.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
+        FuncUseRelativeIDs[<u></u>FunctionsWithBodies.back()] =<br>
+            (SubBlockID == bitc::FUNCTION_BLOCK_REL_ID);<br>
</blockquote>
<br>
If the use of relative ids was on a per module basis then this wouldn't be<br>
needed.<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
+<br>
         if (RememberAndSkipFunctionBody()<u></u>)<br>
           return true;<br>
         // For streaming bitcode, suspend parsing when we reach the function<br>
@@ -1901,8 +1909,15 @@ bool BitcodeReader::<u></u>ParseMetadataAttachment() {<br>
<br>
 /// ParseFunctionBody - Lazily parse the specified function body block.<br>
 bool BitcodeReader::<u></u>ParseFunctionBody(Function *F) {<br>
-  if (Stream.EnterSubBlock(bitc::<u></u>FUNCTION_BLOCK_ID))<br>
-    return Error("Malformed block record");<br>
+  if (FuncUseRelativeIDs[F]) {<br>
+    if (Stream.EnterSubBlock(bitc::<u></u>FUNCTION_BLOCK_REL_ID))<br>
+      return Error("Malformed block record");<br>
+    UseRelativeIDs = true;<br>
+  } else {<br>
+    if (Stream.EnterSubBlock(bitc::<u></u>FUNCTION_BLOCK_ID))<br>
+      return Error("Malformed block record");<br>
+    UseRelativeIDs = false;<br>
+  }<br>
</blockquote>
<br>
Likewise.<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
   InstructionList.clear();<br>
   unsigned ModuleValueListSize = ValueList.size();<br>
</blockquote>
...<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
@@ -2260,8 +2275,10 @@ bool BitcodeReader::<u></u>ParseFunctionBody(Function *F) {<br>
       }<br>
       else {<br>
         BasicBlock *FalseDest = getBasicBlock(Record[1]);<br>
-        Value *Cond = getFnValueByID(Record[2], Type::getInt1Ty(Context));<br>
-        if (FalseDest == 0 || Cond == 0)<br>
+        Value *Cond;<br>
+        if (getValueConst(Record, 2,<br>
+                          NextValueNo, Type::getInt1Ty(Context), Cond) ||<br>
+            FalseDest == 0 || Cond == 0)<br>
</blockquote>
<br>
This seems rather ugly and complicated...  Can't your new method just return<br>
"Cond", and return null in case of an error?  Not sure the name is the best<br>
either, it doesn't suggest at all to me that it doesn't increment the slot<br>
number, it sounds like it's for handling constants.<br>
<br></blockquote><div><br></div><div>Yes, I agree it's pretty ugly as it is now.  It was modeled after the</div><div>"getValueTypePair" function, which would have signaled an error</div><div>when the result was null, so your suggestion should work.</div>

<div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
           return Error("Invalid BR record");<br>
         I = BranchInst::Create(TrueDest, FalseDest, Cond);<br>
         InstructionList.push_back(I);<br>
@@ -2276,9 +2293,10 @@ bool BitcodeReader::<u></u>ParseFunctionBody(Function *F) {<br>
         Type *OpTy = getTypeByID(Record[1]);<br>
         unsigned ValueBitWidth = cast<IntegerType>(OpTy)-><u></u>getBitWidth();<br>
<br>
-        Value *Cond = getFnValueByID(Record[2], OpTy);<br>
+        Value *Cond;<br>
         BasicBlock *Default = getBasicBlock(Record[3]);<br>
-        if (OpTy == 0 || Cond == 0 || Default == 0)<br>
+        if (getValueConst(Record, 2, NextValueNo, OpTy, Cond) ||<br>
+            OpTy == 0 || Cond == 0 || Default == 0)<br>
           return Error("Invalid SWITCH record");<br>
</blockquote>
<br>
Likewise (more instances follow).<br>
<br>
...<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
@@ -2444,7 +2467,8 @@ bool BitcodeReader::<u></u>ParseFunctionBody(Function *F) {<br>
       InstructionList.push_back(PN);<br>
<br>
       for (unsigned i = 0, e = Record.size()-1; i != e; i += 2) {<br>
-        Value *V = getFnValueByID(Record[1+i], Ty);<br>
+        Value *V = 0;<br>
+        getValueConst(Record, 1+i, NextValueNo, Ty, V);<br>
</blockquote>
<br>
You didn't check the return value.<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
         BasicBlock *BB = getBasicBlock(Record[2+i]);<br>
         if (!V || !BB) return Error("Invalid PHI record");<br>
         PN->addIncoming(V, BB);<br>
</blockquote>
...<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
diff --git a/lib/Bitcode/Reader/<u></u>BitcodeReader.h b/lib/Bitcode/Reader/<u></u>BitcodeReader.h<br>
index e7c4e94..249d723 100644<br>
--- a/lib/Bitcode/Reader/<u></u>BitcodeReader.h<br>
+++ b/lib/Bitcode/Reader/<u></u>BitcodeReader.h<br>
</blockquote>
...<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
@@ -260,14 +274,30 @@ private:<br>
     ResVal = getFnValueByID(ValNo, getTypeByID(TypeNo));<br>
     return ResVal == 0;<br>
   }<br>
+  /// getValue - Read a value out of the specified record from slot 'Slot'.<br>
+  /// Increment Slot past the number of slots used in the record.<br>
+  /// Return true on failure.<br>
   bool getValue(SmallVector<uint64_t, 64> &Record, unsigned &Slot,<br>
-                Type *Ty, Value *&ResVal) {<br>
+                unsigned InstNum, Type *Ty, Value *&ResVal) {<br>
     if (Slot == Record.size()) return true;<br>
     unsigned ValNo = (unsigned)Record[Slot++];<br>
+    // Adjust the ValNo, if it was encoded relative to the InstNum.<br>
+    if (UseRelativeIDs)<br>
+      ValNo = InstNum - ValNo;<br>
+    ResVal = getFnValueByID(ValNo, Ty);<br>
+    return ResVal == 0;<br>
+  }<br>
+  /// getValueConst -- Like getValue, but does not increment the Slot number.<br>
+  bool getValueConst(SmallVector<<u></u>uint64_t, 64> &Record, unsigned Slot,<br>
+                     unsigned InstNum, Type *Ty, Value *&ResVal) {<br>
+    if (Slot == Record.size()) return true;<br>
+    unsigned ValNo = (unsigned)Record[Slot];<br>
+    // Adjust the ValNo, if it was encoded relative to the InstNum.<br>
+    if (UseRelativeIDs)<br>
+      ValNo = InstNum - ValNo;<br>
     ResVal = getFnValueByID(ValNo, Ty);<br>
     return ResVal == 0;<br>
   }<br>
</blockquote>
<br>
How about having just one method, eg getValue, and simply decrement the slot<br>
number by hand in those places that need it.  If you really want two, implement<br>
getValue in terms of getValueConst, by calling it then incrementing the slot<br>
number for example.<br>
<br></blockquote><div><br></div><div>Good suggestions, will try it out.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
-<br>
<br>
   bool ParseModule(bool Resume);<br>
   bool ParseAttributeBlock();<br>
diff --git a/lib/Bitcode/Writer/<u></u>BitcodeWriter.cpp b/lib/Bitcode/Writer/<u></u>BitcodeWriter.cpp<br>
index b3f1bb1..e3ebe38 100644<br>
--- a/lib/Bitcode/Writer/<u></u>BitcodeWriter.cpp<br>
+++ b/lib/Bitcode/Writer/<u></u>BitcodeWriter.cpp<br>
</blockquote>
...<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
@@ -55,7 +62,7 @@ enum {<br>
   CONSTANTS_CE_CAST_Abbrev,<br>
   CONSTANTS_NULL_Abbrev,<br>
<br>
-  // FUNCTION_BLOCK abbrev id's.<br>
+  // FUNCTION_BLOCK_REL abbrev id's.<br>
</blockquote>
<br>
Should this comment have been changed?<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
   FUNCTION_INST_LOAD_ABBREV = bitc::FIRST_APPLICATION_<u></u>ABBREV,<br>
   FUNCTION_INST_BINOP_ABBREV,<br>
   FUNCTION_INST_BINOP_FLAGS_<u></u>ABBREV,<br>
</blockquote>
...<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
@@ -1025,12 +1037,15 @@ static void WriteModuleConstants(const ValueEnumerator &VE,<br>
 ///<br>
 /// This function adds V's value ID to Vals.  If the value ID is higher than the<br>
 /// instruction ID, then it is a forward reference, and it also includes the<br>
-/// type ID.<br>
+/// type ID.  The value ID that is writtne is encoded as relative to the InstID.<br>
</blockquote>
<br>
writtne -> written<br>
is encoded as relative to -> is encoded relative to<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
 static bool PushValueAndType(const Value *V, unsigned InstID,<br>
                              SmallVector<unsigned, 64> &Vals,<br>
                              ValueEnumerator &VE) {<br>
   unsigned ValID = VE.getValueID(V);<br>
-  Vals.push_back(ValID);<br>
+  if (EnableOldStyleFunctions)<br>
+    Vals.push_back(ValID);<br>
+  else<br>
+    Vals.push_back(InstID - ValID);<br>
   if (ValID >= InstID) {<br>
     Vals.push_back(VE.getTypeID(V-<u></u>>getType()));<br>
     return true;<br>
</blockquote>
...<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
@@ -1164,7 +1191,12 @@ static void WriteInstruction(const Instruction &I, unsigned InstID,<br>
       Vals64.push_back(<u></u>SwitchRecordHeader);<br>
<br>
       Vals64.push_back(VE.getTypeID(<u></u>SI.getCondition()->getType()))<u></u>;<br>
-      Vals64.push_back(VE.<u></u>getValueID(SI.getCondition()))<u></u>;<br>
+      // ValueID for non-BB / literal operands are relative to the InstID.<br>
+      // (e.g., the condition value).<br>
+      if (EnableOldStyleFunctions)<br>
+        Vals64.push_back(VE.<u></u>getValueID(SI.getCondition()))<u></u>;<br>
+      else<br>
+        Vals64.push_back(InstID - VE.getValueID(SI.getCondition(<u></u>)));<br>
</blockquote>
<br>
Shouldn't you use a "push" method like PushValue for this too?<br></blockquote><div><br></div><div>These were different because they used uint64_t with a "Vals64" vector.</div><div>I could make a PushValue64.</div>

<div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
       Vals64.push_back(VE.<u></u>getValueID(SI.getDefaultDest()<u></u>));<br>
       Vals64.push_back(SI.<u></u>getNumCases());<br>
       for (SwitchInst::CaseIt i = SI.case_begin(), e = SI.case_end();<br>
</blockquote>
...<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
@@ -1358,8 +1392,13 @@ static void WriteInstruction(const Instruction &I, unsigned InstID,<br>
     PushValueAndType(CI.<u></u>getCalledValue(), InstID, Vals, VE);  // Callee<br>
<br>
     // Emit value #'s for the fixed parameters.<br>
-    for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)<br>
-      Vals.push_back(VE.getValueID(<u></u>CI.getArgOperand(i)));  // fixed param.<br>
+    for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) {<br>
+      if (FTy->getParamType(i)-><u></u>isLabelTy()) {<br>
</blockquote>
<br>
Is this actually possible?<br>
<br></blockquote><div><br></div><div>I'm not sure =)</div><div><br></div><div>I had originally added it because I noticed that the code in BitcodeReader</div><div>for FUNC_CODE_INST_CALL had the check:</div>
<div><br></div><div> if (FTy->getParamType(i)->isLabelTy())</div><div>          Args.push_back(getBasicBlock(Record[OpNum]));</div><div><br></div><div>I'll take this modification out, since it's orthogonal, and I'm not sure</div>
<div>what the original motivation was.</div><div> </div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
+        Vals.push_back(VE.getValueID(<u></u>CI.getArgOperand(i)));<br>
+      } else {<br>
+        PushValue(CI.getArgOperand(i), InstID, Vals, VE);  // fixed param.<br>
+      }<br>
+    }<br>
<br>
     // Emit type/value pairs for varargs params.<br>
     if (FTy->isVarArg()) {<br>
</blockquote>
...<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
@@ -1514,8 +1553,8 @@ static void WriteFunction(const Function &F, ValueEnumerator &VE,<br>
 // Emit blockinfo, which defines the standard abbreviations etc.<br>
 static void WriteBlockInfo(const ValueEnumerator &VE, BitstreamWriter &Stream) {<br>
   // We only want to emit block info records for blocks that have multiple<br>
-  // instances: CONSTANTS_BLOCK, FUNCTION_BLOCK and VALUE_SYMTAB_BLOCK.  Other<br>
-  // blocks can defined their abbrevs inline.<br>
+  // instances: CONSTANTS_BLOCK, FUNCTION_BLOCK_REL and VALUE_SYMTAB_BLOCK.<br>
+  // Other blocks can defined their abbrevs inline.<br>
</blockquote>
<br>
Should this comment really have changed?<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
   Stream.EnterBlockInfoBlock(2);<br>
<br>
   { // 8-bit fixed-width VST_ENTRY/VST_BBENTRY strings.<br>
@@ -1603,68 +1642,68 @@ static void WriteBlockInfo(const ValueEnumerator &VE, BitstreamWriter &Stream) {<br>
<br>
   // FIXME: This should only use space for first class types!<br>
<br>
-  { // INST_LOAD abbrev for FUNCTION_BLOCK.<br>
+  { // INST_LOAD abbrev for FUNCTION_BLOCK_REL.<br>
</blockquote>
<br>
Likewise (occurs many more times).<br>
<br>
Ciao, Duncan.<br>
______________________________<u></u>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/llvmdev</a></blockquote><div><br></div><div>Thanks!</div><div>- Jan </div></div><br></div></div>
</div>