r232389 - Global inline assembler blocks are merged before parsing, so no specific

Douglas Gregor dgregor at apple.com
Tue Mar 17 09:45:52 PDT 2015


The patch looks fine to me.

	- Doug

> On Mar 16, 2015, at 11:17 AM, Joerg Sonnenberger <joerg at britannica.bec.de> wrote:
> 
> As discussed on IRC a few days ago, I would like to get merge this to
> 3.6. Doug, Eric, Tom?
> 
> Joerg
> 
> On Mon, Mar 16, 2015 at 05:54:55PM -0000, Joerg Sonnenberger wrote:
>> Author: joerg
>> Date: Mon Mar 16 12:54:54 2015
>> New Revision: 232389
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=232389&view=rev
>> Log:
>> Global inline assembler blocks are merged before parsing, so no specific
>> location data is available. If pragma handling wants to look up the
>> position, it finds the LLVM buffer and wants to compare it with the
>> special built-in buffer, failing badly. Extend to the special handling
>> of the built-in buffer to also check for the inline asm buffer. Expect
>> only a single asm buffer. Sort it between the built-in buffers and the
>> normal file buffers.
>> 
>> Fixes the assert part of PR 22576.
>> 
>> Added:
>>    cfe/trunk/test/CodeGen/invalid_global_asm.c
>> Modified:
>>    cfe/trunk/lib/Basic/SourceManager.cpp
>> 
>> Modified: cfe/trunk/lib/Basic/SourceManager.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/SourceManager.cpp?rev=232389&r1=232388&r2=232389&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Basic/SourceManager.cpp (original)
>> +++ cfe/trunk/lib/Basic/SourceManager.cpp Mon Mar 16 12:54:54 2015
>> @@ -2076,22 +2076,33 @@ bool SourceManager::isBeforeInTranslatio
>>     return IsBeforeInTUCache.getCachedResult(LOffs.second, ROffs.second);
>>   }
>> 
>> -  // This can happen if a location is in a built-ins buffer.
>> -  // But see PR5662.
>> +  // If we arrived here, the location is either in a built-ins buffer or
>> +  // associated with global inline asm. PR5662 and PR22576 are examples.
>> +
>>   // Clear the lookup cache, it depends on a common location.
>>   IsBeforeInTUCache.clear();
>> -  bool LIsBuiltins = strcmp("<built-in>",
>> -                            getBuffer(LOffs.first)->getBufferIdentifier()) == 0;
>> -  bool RIsBuiltins = strcmp("<built-in>",
>> -                            getBuffer(ROffs.first)->getBufferIdentifier()) == 0;
>> -  // built-in is before non-built-in
>> -  if (LIsBuiltins != RIsBuiltins)
>> -    return LIsBuiltins;
>> -  assert(LIsBuiltins && RIsBuiltins &&
>> -         "Non-built-in locations must be rooted in the main file");
>> -  // Both are in built-in buffers, but from different files. We just claim that
>> -  // lower IDs come first.
>> -  return LOffs.first < ROffs.first;
>> +  llvm::MemoryBuffer *LBuf = getBuffer(LOffs.first);
>> +  llvm::MemoryBuffer *RBuf = getBuffer(ROffs.first);
>> +  bool LIsBuiltins = strcmp("<built-in>", LBuf->getBufferIdentifier()) == 0;
>> +  bool RIsBuiltins = strcmp("<built-in>", RBuf->getBufferIdentifier()) == 0;
>> +  // Sort built-in before non-built-in.
>> +  if (LIsBuiltins || RIsBuiltins) {
>> +    if (LIsBuiltins != RIsBuiltins)
>> +      return LIsBuiltins;
>> +    // Both are in built-in buffers, but from different files. We just claim that
>> +    // lower IDs come first.
>> +    return LOffs.first < ROffs.first;
>> +  }
>> +  bool LIsAsm = strcmp("<inline asm>", LBuf->getBufferIdentifier()) == 0;
>> +  bool RIsAsm = strcmp("<inline asm>", RBuf->getBufferIdentifier()) == 0;
>> +  // Sort assembler after built-ins, but before the rest.
>> +  if (LIsAsm || RIsAsm) {
>> +    if (LIsAsm != RIsAsm)
>> +      return RIsAsm;
>> +    assert(LOffs.first == ROffs.first);
>> +    return false;
>> +  }
>> +  llvm_unreachable("Unsortable locations found");
>> }
>> 
>> void SourceManager::PrintStats() const {
>> 
>> Added: cfe/trunk/test/CodeGen/invalid_global_asm.c
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/invalid_global_asm.c?rev=232389&view=auto
>> ==============================================================================
>> --- cfe/trunk/test/CodeGen/invalid_global_asm.c (added)
>> +++ cfe/trunk/test/CodeGen/invalid_global_asm.c Mon Mar 16 12:54:54 2015
>> @@ -0,0 +1,5 @@
>> +// REQUIRES: arm-registered-target
>> +// RUN: not %clang_cc1 -emit-obj -triple armv6-unknown-unknown -o %t %s 2>&1 | FileCheck %s
>> +#pragma clang diagnostic ignored "-Wmissing-noreturn"
>> +__asm__(".Lfoo: movw r2, #:lower16:.Lbar - .Lfoo");
>> +// CHECK: <inline asm>:1:8: error: instruction requires: armv6t2
>> 
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits





More information about the cfe-commits mailing list