// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu %s -emit-llvm -o - | FileCheck %s | |
// RUN: %clang_cc1 -triple x86_64-pc-win32 %s -emit-llvm -o - | FileCheck %s | |
// CHECK: foo{{[^#]*}}#[[ATTRS:[0-9]+]] | |
__attribute__((no_caller_saved_registers)) void foo() {} | |
namespace S { | |
// CHECK: bar{{[^#]*}}#[[ATTRS]] | |
__attribute__((no_caller_saved_registers)) void bar(int *a) { foo(); } | |
} | |
struct St { | |
static void baz(int *a) __attribute__((no_caller_saved_registers)) { S::bar(a); } | |
}; | |
__attribute((no_caller_saved_registers)) void (*foobar)(void); | |
// CHECK-LABEL: @main | |
int main(int argc, char **argv) { | |
St::baz(&argc); | |
// CHECK: [[FOOBAR:%.+]] = load void ()*, void ()** @{{.*}}foobar{{.*}}, | |
// CHECK-NEXT: call void [[FOOBAR]]() #[[ATTRS1:.+]] | |
foobar(); | |
return 0; | |
} | |
// CHECK: baz{{[^#]*}}#[[ATTRS]] | |
// CHECK: attributes #[[ATTRS]] = { | |
// CHECK-SAME: "no_caller_saved_registers" | |
// CHECK-SAME: } | |
// CHECK: attributes #[[ATTRS1]] = { "no_caller_saved_registers" } |