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