// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir // RUN: FileCheck --input-file=%t.cir %s -check-prefixes=CIR,CIR-DEF // // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t.ll // RUN: FileCheck --input-file=%t.ll %s -check-prefixes=LLVM,LLVM-DEF // // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o %t.ll // RUN: FileCheck --input-file=%t.ll %s -check-prefixes=LLVM,LLVM-DEF // // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir -fno-builtin-memcmp %s -o %t.cir // RUN: FileCheck --input-file=%t.cir %s -check-prefixes=CIR,CIR-SPC // // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm -fno-builtin-memcmp %s -o %t.ll // RUN: FileCheck --input-file=%t.ll %s -check-prefixes=LLVM,LLVM-SPC // // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -fno-builtin-memcmp %s -o %t.ll // RUN: FileCheck --input-file=%t.ll %s -check-prefixes=LLVM,LLVM-SPC // // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir -fno-builtin-memcmp -fno-builtin-memset %s -o %t.cir // RUN: FileCheck --input-file=%t.cir %s -check-prefixes=CIR,CIR-BTH // // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm -fno-builtin-memcmp -fno-builtin-memset %s -o %t.ll // RUN: FileCheck --input-file=%t.ll %s -check-prefixes=LLVM,LLVM-BTH // // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -fno-builtin-memcmp -fno-builtin-memset %s -o %t.ll // RUN: FileCheck --input-file=%t.ll %s -check-prefixes=LLVM,LLVM-BTH // // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir -fno-builtin %s -o %t.cir // RUN: FileCheck --input-file=%t.cir %s -check-prefixes=CIR,CIR-ALL // // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm -fno-builtin %s -o %t.ll // RUN: FileCheck --input-file=%t.ll %s -check-prefixes=LLVM,LLVM-ALL // // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -fno-builtin %s -o %t.ll // RUN: FileCheck --input-file=%t.ll %s -check-prefixes=LLVM,LLVM-ALL extern "C" { // CIR: cir.func{{.*}}@normal() attributes { // CIR-DEF-NOT: nobuiltins // CIR-SPC-SAME: nobuiltins = ["memcmp"] // CIR-BTH-SAME: nobuiltins = ["memcmp", "memset"] // CIR-ALL-SAME: nobuiltins = [] // LLVM: define{{.*}}normal() #[[NORM_ATTR:.*]] { __attribute__((cold)) // to force attributes on the call to be around. void normal(){} // CIR: cir.func{{.*}}@no_builtins() attributes { // CIR-DEF-SAME: nobuiltins = [] // CIR-SPC-SAME: nobuiltins = [] // CIR-BTH-SAME: nobuiltins = [] // CIR-ALL-SAME: nobuiltins = [] // LLVM: define{{.*}}no_builtins() #[[NB_ATTR:.*]] { __attribute__((no_builtin)) __attribute__((hot)) // force unique attributes void no_builtins() {} // CIR: cir.func{{.*}}@no_memcpy() attributes { // CIR-DEF-SAME: nobuiltins = ["memcpy"] // CIR-SPC-SAME: nobuiltins = ["memcmp", "memcpy"] // CIR-BTH-SAME: nobuiltins = ["memcmp", "memset", "memcpy"] // CIR-ALL-SAME: nobuiltins = [] // LLVM: define{{.*}}no_memcpy() #[[NO_MCPY_ATTR:.*]] { __attribute__((no_builtin("memcpy"))) __attribute__((leaf)) // force unique attributes void no_memcpy() {} // CIR: cir.func{{.*}}@no_memcmp() attributes { // CIR-DEF-SAME: nobuiltins = ["memcmp"] // CIR-SPC-SAME: nobuiltins = ["memcmp"] // CIR-BTH-SAME: nobuiltins = ["memcmp", "memset"] // CIR-ALL-SAME: nobuiltins = [] // LLVM: define{{.*}}no_memcmp() #[[NO_MCMP_ATTR:.*]] { __attribute__((no_builtin("memcmp"))) __attribute__((noduplicate)) // force unique attributes void no_memcmp() {} // CIR: cir.func{{.*}}@no_both() attributes { // CIR-DEF-SAME: nobuiltins = ["memcmp", "memcpy"] // CIR-SPC-SAME: nobuiltins = ["memcmp", "memcpy"] // CIR-BTH-SAME: nobuiltins = ["memcmp", "memset", "memcpy"] // CIR-ALL-SAME: nobuiltins = [] // LLVM: define{{.*}}no_both() #[[NO_BOTH_ATTR:.*]] { __attribute__((no_builtin("memcpy"))) __attribute__((no_builtin("memcmp"))) __attribute__((convergent)) // force unique attributes void no_both(){} } void caller() { // CIR: cir.call @normal() { // CIR-DEF-NOT: nobuiltins // CIR-SPC-SAME: nobuiltins = ["memcmp"] // CIR-BTH-SAME: nobuiltins = ["memcmp", "memset"] // CIR-ALL-SAME: nobuiltins = [] // LLVM: call void @normal() #[[NORM_CALL_ATTR:.*]] normal(); // CIR: cir.call @no_builtins() { // CIR-DEF-SAME: nobuiltins = [] // CIR-SPC-SAME: nobuiltins = [] // CIR-BTH-SAME: nobuiltins = [] // CIR-ALL-SAME: nobuiltins = [] // LLVM: call void @no_builtins() #[[NB_CALL_ATTR:.*]] no_builtins(); // CIR: cir.call @no_memcpy() { // CIR-DEF-SAME: nobuiltins = ["memcpy"] // CIR-SPC-SAME: nobuiltins = ["memcmp", "memcpy"] // CIR-BTH-SAME: nobuiltins = ["memcmp", "memset", "memcpy"] // CIR-ALL-SAME: nobuiltins = [] // LLVM: call void @no_memcpy() #[[NO_MCPY_CALL_ATTR:.*]] no_memcpy(); // CIR: cir.call @no_memcmp() { // CIR-DEF-SAME: nobuiltins = ["memcmp"] // CIR-SPC-SAME: nobuiltins = ["memcmp"] // CIR-BTH-SAME: nobuiltins = ["memcmp", "memset"] // CIR-ALL-SAME: nobuiltins = [] // LLVM: call void @no_memcmp() #[[NO_MCMP_CALL_ATTR:.*]] no_memcmp(); // CIR: cir.call @no_both() { // CIR-DEF-SAME: nobuiltins = ["memcmp", "memcpy"] // CIR-SPC-SAME: nobuiltins = ["memcmp", "memcpy"] // CIR-BTH-SAME: nobuiltins = ["memcmp", "memset", "memcpy"] // CIR-ALL-SAME: nobuiltins = [] // LLVM: call void @no_both() #[[NO_BOTH_CALL_ATTR:.*]] no_both(); } // LLVM: attributes #[[NORM_ATTR]] = { // LLVM-DEF-NOT: no-builtin // LLVM-SPC-SAME: "no-builtin-memcmp" // LLVM-BTH-SAME: "no-builtin-memcmp" // LLVM-BTH-SAME: "no-builtin-memset" // LLVM-ALL-SAME:"no-builtins" // // LLVM: attributes #[[NB_ATTR]] = { // LLVM-DEF-SAME:"no-builtins" // LLVM-SPC-SAME:"no-builtins" // LLVM-BTH-SAME:"no-builtins" // LLVM-ALL-SAME:"no-builtins" // // LLVM: attributes #[[NO_MCPY_ATTR]] = { // LLVM-DEF-SAME: "no-builtin-memcpy" // LLVM-SPC-SAME: "no-builtin-memcmp" // LLVM-SPC-SAME: "no-builtin-memcpy" // LLVM-BTH-SAME: "no-builtin-memcmp" // LLVM-BTH-SAME: "no-builtin-memcpy" // LLVM-BTH-SAME: "no-builtin-memset" // LLVM-ALL-SAME:"no-builtins" // // LLVM: attributes #[[NO_MCMP_ATTR]] = { // LLVM-DEF-SAME: "no-builtin-memcmp" // LLVM-SPC-SAME: "no-builtin-memcmp" // LLVM-BTH-SAME: "no-builtin-memcmp" // LLVM-BTH-SAME: "no-builtin-memset" // LLVM-ALL-SAME:"no-builtins" // // LLVM: attributes #[[NO_BOTH_ATTR]] = { // LLVM-DEF-SAME: "no-builtin-memcmp" // LLVM-DEF-SAME: "no-builtin-memcpy" // LLVM-SPC-SAME: "no-builtin-memcmp" // LLVM-SPC-SAME: "no-builtin-memcpy" // LLVM-BTH-SAME: "no-builtin-memcmp" // LLVM-BTH-SAME: "no-builtin-memcpy" // LLVM-BTH-SAME: "no-builtin-memset" // LLVM-ALL-SAME:"no-builtins" // // // LLVM: attributes #[[NORM_CALL_ATTR]] = { // LLVM-DEF-NOT: no-builtin // LLVM-SPC-SAME: "no-builtin-memcmp" // LLVM-BTH-SAME: "no-builtin-memcmp" // LLVM-BTH-SAME: "no-builtin-memset" // LLVM-ALL-SAME:"no-builtins" // // LLVM: attributes #[[NB_CALL_ATTR]] = { // LLVM-DEF-SAME:"no-builtins" // LLVM-SPC-SAME:"no-builtins" // LLVM-BTH-SAME:"no-builtins" // LLVM-ALL-SAME:"no-builtins" // // LLVM: attributes #[[NO_MCPY_CALL_ATTR]] = { // LLVM-DEF-SAME: "no-builtin-memcpy" // LLVM-SPC-SAME: "no-builtin-memcmp" // LLVM-SPC-SAME: "no-builtin-memcpy" // LLVM-BTH-SAME: "no-builtin-memcmp" // LLVM-BTH-SAME: "no-builtin-memcpy" // LLVM-BTH-SAME: "no-builtin-memset" // LLVM-ALL-SAME:"no-builtins" // // LLVM: attributes #[[NO_MCMP_CALL_ATTR]] = { // LLVM-DEF-SAME: "no-builtin-memcmp" // LLVM-SPC-SAME: "no-builtin-memcmp" // LLVM-BTH-SAME: "no-builtin-memcmp" // LLVM-BTH-SAME: "no-builtin-memset" // LLVM-ALL-SAME:"no-builtins" // // LLVM: attributes #[[NO_BOTH_CALL_ATTR]] = { // LLVM-DEF-SAME: "no-builtin-memcmp" // LLVM-DEF-SAME: "no-builtin-memcpy" // LLVM-SPC-SAME: "no-builtin-memcmp" // LLVM-SPC-SAME: "no-builtin-memcpy" // LLVM-BTH-SAME: "no-builtin-memcmp" // LLVM-BTH-SAME: "no-builtin-memcpy" // LLVM-BTH-SAME: "no-builtin-memset" // LLVM-ALL-SAME:"no-builtins"