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