Replace GetNumBytesInBuffer() in MicrosoftCXXNameMangler::mangleArgumentType by tell().
Using GetNumBytesInBuffer() assumes that the stream was not flushed between the GetNumBytesInBuffer() calls, which may happen to be true or not, depending on stream policy. tell() always reports the correct stream location. Do note there are only two more uses of GetNumBytesInBuffer() in LLVM+clang, in lib/MC/MCAsmStreamer.cpp and lib/Target/R600/InstPrinter/AMDGPUInstPrinter.cpp. The former may be replacable by tell (needs testing) but while the later can not be immediatly replaced by tell() as it uses the absolute value of GetNumBytesInBuffer() rather than the real stream position. Both uses seems to depend upon flush policy and thus may not work correctly depending upon the stream behaviour. Going forward, GetNumBytesInBuffer() should probably be protected, non-accessible to raw_ostream clients. llvm-svn: 236389
This commit is contained in:
parent
d5e20306cc
commit
2155f80426
|
@ -1401,14 +1401,14 @@ void MicrosoftCXXNameMangler::mangleArgumentType(QualType T,
|
|||
ArgBackRefMap::iterator Found = TypeBackReferences.find(TypePtr);
|
||||
|
||||
if (Found == TypeBackReferences.end()) {
|
||||
size_t OutSizeBefore = Out.GetNumBytesInBuffer();
|
||||
size_t OutSizeBefore = Out.tell();
|
||||
|
||||
mangleType(T, Range, QMM_Drop);
|
||||
|
||||
// See if it's worth creating a back reference.
|
||||
// Only types longer than 1 character are considered
|
||||
// and only 10 back references slots are available:
|
||||
bool LongerThanOneChar = (Out.GetNumBytesInBuffer() - OutSizeBefore > 1);
|
||||
bool LongerThanOneChar = (Out.tell() - OutSizeBefore > 1);
|
||||
if (LongerThanOneChar && TypeBackReferences.size() < 10) {
|
||||
size_t Size = TypeBackReferences.size();
|
||||
TypeBackReferences[TypePtr] = Size;
|
||||
|
|
Loading…
Reference in New Issue