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