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>