r241043 - [CodeGen] Tweak isTriviallyRecursive further

H.J. Lu hjl.tools at gmail.com
Tue Jun 30 10:00:58 PDT 2015


On Mon, Jun 29, 2015 at 9:41 PM, David Majnemer
<david.majnemer at gmail.com> wrote:
> Author: majnemer
> Date: Mon Jun 29 23:41:18 2015
> New Revision: 241043
>
> URL: http://llvm.org/viewvc/llvm-project?rev=241043&view=rev
> Log:
> [CodeGen] Tweak isTriviallyRecursive further
>
> isTriviallyRecursive is a hack used to bridge a gap between the
> expectations that source code assumes and the semantics that LLVM IR can
> provide.  Specifically, asm labels on functions are treated as an
> explicit name for a GlobalObject in Clang but treated like an
> output-processing step in GCC.  Tweak this hack a little further to emit
> calls to library functions instead of emitting an incorrect definition.
> The definition in question would have available_externally linkage (this
> is OK) but result in a call to itself which will either result in an
> infinite loop or stack overflow.
>
> This fixes PR23964.
>
> Modified:
>     cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>     cfe/trunk/test/CodeGen/pr9614.c
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=241043&r1=241042&r2=241043&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Mon Jun 29 23:41:18 2015
> @@ -1457,12 +1457,7 @@ CodeGenModule::isTriviallyRecursive(cons
>      Name = FD->getName();
>    }
>
> -  auto &BI = Context.BuiltinInfo;
> -  unsigned BuiltinID = Context.Idents.get(Name).getBuiltinID();
> -  if (!BuiltinID || !BI.isPredefinedLibFunction(BuiltinID))
> -    return false;
> -
> -  FunctionIsDirectlyRecursive Walker(Name, BI);
> +  FunctionIsDirectlyRecursive Walker(Name, Context.BuiltinInfo);
>    Walker.TraverseFunctionDecl(const_cast<FunctionDecl*>(FD));
>    return Walker.Result;
>  }
>
> Modified: cfe/trunk/test/CodeGen/pr9614.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/pr9614.c?rev=241043&r1=241042&r2=241043&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGen/pr9614.c (original)
> +++ cfe/trunk/test/CodeGen/pr9614.c Mon Jun 29 23:41:18 2015
> @@ -18,11 +18,16 @@ prefetch(void) {
>    __builtin_prefetch(0, 0, 1);
>  }
>
> +extern inline __attribute__((__always_inline__, __gnu_inline__)) void *memchr(void *__s, int __c, __SIZE_TYPE__ __n) {
> +  return __builtin_memchr(__s, __c, __n);
> +}
> +
>  void f(void) {
>    foo();
>    abs(0);
>    strrchr_foo("", '.');
>    prefetch();
> +  memchr("", '.', 0);
>  }
>
>  // CHECK-LABEL: define void @f()
> @@ -30,9 +35,11 @@ void f(void) {
>  // CHECK: call i32 @abs(i32 0)
>  // CHECK: call i8* @strrchr(
>  // CHECK: call void @llvm.prefetch(
> +// CHECK: call i8* @memchr(
>  // CHECK: ret void
>
>  // CHECK: declare void @foo()
>  // CHECK: declare i32 @abs(i32
>  // CHECK: declare i8* @strrchr(i8*, i32)
> +// CHECK: declare i8* @memchr(
>  // CHECK: declare void @llvm.prefetch(
>

Is test/CodeGen/pr9614.c compiled with -fno-builtin?
If not, PR23964 won't be tested.

-- 
H.J.



More information about the cfe-commits mailing list