lebedev.ri added a comment.

Tried fixing `tooling::FrontendActionFactory::create()` in 
https://reviews.llvm.org/D43779/https://reviews.llvm.org/D43780, but had to 
revert due to gcc4.8 issues :/

Thank you for working on this, some more review notes.

In https://reviews.llvm.org/D41102#1020107, @juliehockett wrote:

> In https://reviews.llvm.org/D41102#1017918, @lebedev.ri wrote:
>
> > Is there some (internal to `BitstreamWriter`) logic that would 'assert()' 
> > if trying to output some recordid
> >  which is, according to the `BLOCKINFO_BLOCK`, should not be there?
> >  E.g. outputting `VERSION` in `BI_COMMENT_BLOCK_ID`?
>
>
> Yes -- it will fail an assertion:
>  `Assertion 'V == Op.getLiteralValue() && "Invalid abbrev for record!"' 
> failed.`


Ok, great.
And it will also complain if you try to output a block within block?



================
Comment at: clang-doc/BitcodeWriter.cpp:184
+          return RecordIdNameMap;
+        }  // namespace doc
+();
----------------
That comment seems wrong.
**If** the namespace is indeed supposed to be closed, it should happen after 
the lambda is called, i.e.
```
          assert(RecordIdNameMap.size() == RecordIdCount);
          return RecordIdNameMap;
        }();
}  // namespace doc

// AbbreviationMap


================
Comment at: clang-doc/BitcodeWriter.cpp:265
+  if (!prepRecordData(ID, !OmitFilenames)) return;
+  // FIXME: Assert that the line number is of the appropriate size.
+  Record.push_back(Loc.LineNumber);
----------------
I think it is as simple as
```
assert(Loc.LineNumber < (1U << BitCodeConstants::LineNumberSize));
```
?


================
Comment at: clang-doc/BitcodeWriter.cpp:367
+    BlockId BID, const std::initializer_list<RecordId> &RIDs) {
+  emitBlockID(BID);
+  for (RecordId RID : RIDs) {
----------------
So i guess this should be:
```
void ClangDocBitcodeWriter::emitBlockInfo(
    BlockId BID, const std::initializer_list<RecordId> &RIDs) {
  assert(RIDs.size() < (1U << BitCodeConstants::SubblockIDSize), "Too many 
records in a block!");
  emitBlockID(BID);
...
```
?


================
Comment at: clang-doc/BitcodeWriter.cpp:191
+  Record.clear();
+  for (const char C : BlockIdNameMap[ID]) Record.push_back(C);
+  Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_BLOCKNAME, Record);
----------------
juliehockett wrote:
> lebedev.ri wrote:
> > Why do we have this indirection?
> > Is there a need to first to (unefficiently?) copy to `Record`, and then 
> > emit from there?
> > Wouldn't this work just as well?
> > ```
> > Record.clear();
> > Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_BLOCKNAME, BlockIdNameMap[ID]);
> > ```
> No, since `BlockIdNameMap[ID]` returns a `StringRef`, which can be 
> manipulated into an `std::string` or a `const char*`, but the `Stream` wants 
> an `unsigned char`. So, the copying is to satisfy that. Unless there's a 
> better way to convert a `StringRef` into an array of `unsigned char`?
Aha, i see, did not think of that.
But there is a `bytes()` function in `StringRef`, which returns 
`iterator_range<const unsigned char *>`. 
Would it help? 
http://llvm.org/doxygen/classllvm_1_1StringRef.html#a5e8f22c3553e341404b445430a3b075b


================
Comment at: clang-doc/BitcodeWriter.cpp:240
+  if (!prepRecordData(ID, Val)) return;
+  assert(Val < (1U << BitCodeConstants::IntSize));
+  Record.push_back(Val);
----------------
juliehockett wrote:
> lebedev.ri wrote:
> > Ok, now that i think about it, it can't be that easy.
> > Maybe
> > ```
> > FIXME: assumes 8 bits per byte
> > assert(llvm::APInt(8U*sizeof(Val), Val, /*isSigned=*/true).getBitWidth() <= 
> > BitCodeConstants::IntSize));
> > ```
> > Not sure whether `getBitWidth()` is really the right function to ask though.
> > (Not sure how this all works for negative numbers)
> That assertion fails :/ I could do something like `static_cast<int64_t>(Val) 
> == Val` but that would require a) IntSize being a power of 2 b) updating the 
> assert anytime IntSize is updated, and 3) still throws a warning about 
> comparing a signed to an unsigned int...
I see. Let's not have this assertion for now, just a `FIXME`.


================
Comment at: clang-doc/BitcodeWriter.h:53
+  BI_LAST = BI_COMMENT_BLOCK_ID
+};
+
----------------
juliehockett wrote:
> lebedev.ri wrote:
> > juliehockett wrote:
> > > lebedev.ri wrote:
> > > > So what *exactly* does `BitCodeConstants::SubblockIDSize` mean?
> > > > ```
> > > > static_assert(BI_LAST < (1U << BitCodeConstants::SubblockIDSize), "Too 
> > > > many block id's!");
> > > > ```
> > > > ?
> > > It's the current abbrev id width for the block (described [[ 
> > > https://llvm.org/docs/BitCodeFormat.html#enter-subblock-encoding | here 
> > > ]]), so it's the max id width for the block's abbrevs.
> > So in other words that `static_assert()` is doing the right thing?
> > Add it after the `enum BlockId{}` then please, will both document things, 
> > and ensure that things remain in a sane state.
> No...it's the (max) number of the abbrevs relevant to the block itself, which 
> is to say some subset of the RecordIds for any given block (e.g. for a 
> `BI_COMMENT_BLOCK`,  the number of abbrevs would be 12 and so on the abbrev 
> width would be 4). 
> 
> To assert for it we could put block start/end markers on the RecordIds and 
> then use that to calculate the bitwidth, if you think the assertion should be 
> there.
Aha, i see, so that should go into 
`ClangDocBitcodeWriter::emitBlockInfoBlock()`, since that already has that info.
(On a related node, it feels like this all should be somehow 
tablegen-generated, but that is for some later, post-commit cleanup.)


https://reviews.llvm.org/D41102



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to