32 lines
1005 B
C++
32 lines
1005 B
C++
// 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" }
|