r232389 - Global inline assembler blocks are merged before parsing, so no specific
Joerg Sonnenberger
joerg at britannica.bec.de
Mon Mar 16 11:17:25 PDT 2015
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