summaryrefslogtreecommitdiffstats
path: root/test/CodeGenCXX/attr-x86-no_caller_saved_registers.cpp
blob: c032e38f31b315f5e1e13ebaf01a1e38235d1522 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 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" }