brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.6 KiB · 7dad927 Raw
140 lines · cpp
1// RUN: %clang_cc1 -emit-llvm -triple i686-pc-win32 -fms-extensions -verify -o - %s | FileCheck %s2// expected-no-diagnostics3 4// Simple case5 6int __declspec(code_seg("foo_one")) bar_one() { return 1; }7//CHECK: define {{.*}}bar_one{{.*}} section "foo_one"8 9// Simple case - explicit attribute used over pragma10#pragma code_seg("foo_two")11int __declspec(code_seg("foo_three")) bar2() { return 2; }12//CHECK: define {{.*}}bar2{{.*}} section "foo_three"13 14// Check that attribute on one function doesn't affect another15int another1() { return 1001; }16//CHECK: define {{.*}}another1{{.*}} section "foo_two"17 18// Member functions19 20struct __declspec(code_seg("foo_four")) Foo {21  int bar3() {return 0;}22  int bar4();23  int __declspec(code_seg("foo_six")) bar6() { return 6; }24  int bar7() { return 7; }25  struct Inner {26    int bar5() { return 5; }27  } z;28  virtual int baz1() { return 1; }29};30 31struct __declspec(code_seg("foo_four")) FooTwo : Foo {32  int baz1() { return 20; }33};34 35int caller1() {36  Foo f; return f.bar3();37}38 39//CHECK: define {{.*}}bar3@Foo{{.*}} section "foo_four"40int Foo::bar4() { return 4; }41//CHECK: define {{.*}}bar4@Foo{{.*}} section "foo_four"42 43#pragma code_seg("someother")44 45int caller2() {46  Foo f;47  Foo *fp = new FooTwo;48  return f.z.bar5() + f.bar6() + f.bar7() + fp->baz1();49}50// MS Compiler and Docs do not match for nested routines51// Doc says:      define {{.*}}bar5@Inner@Foo{{.*}} section "foo_four"52// Compiler says: define {{.*}}bar5@Inner@Foo{{.*}} section "foo_two"53// A bug has been reported: see https://reviews.llvm.org/D22931, the54// Microsoft feedback page is no longer available.55//CHECK: define {{.*}}bar5@Inner@Foo{{.*}} section "foo_two"56//CHECK: define {{.*}}bar6@Foo{{.*}} section "foo_six"57//CHECK: define {{.*}}bar7@Foo{{.*}} section "foo_four"58// Check that code_seg active at class declaration is not used on member59// declared outside class when it is not active.60 61#pragma code_seg(push,"AnotherSeg")62 63struct FooThree {64  int bar8();65  int bar9() { return 9; }66};67 68#pragma code_seg(pop)69 70 71int FooThree::bar8() {return 0;}72 73int caller3()74{75  FooThree f;76  return f.bar8() + f.bar9();77}78 79//CHECK: define {{.*}}bar8@FooThree{{.*}} section "someother"80//CHECK: define {{.*}}bar9@FooThree{{.*}} section "AnotherSeg"81 82struct NonTrivialCopy {83  NonTrivialCopy();84  NonTrivialCopy(const NonTrivialCopy&);85  ~NonTrivialCopy();86};87 88// check the section for compiler-generated function with declspec.89 90struct __declspec(code_seg("foo_seven")) FooFour {91  FooFour() {}92  int __declspec(code_seg("foo_eight")) bar10(int t) { return t; }93  NonTrivialCopy f;94};95 96//CHECK: define {{.*}}0FooFour@@QAE@ABU0@@Z{{.*}} section "foo_seven"97// check the section for compiler-generated function with no declspec.98 99struct FooFive {100  FooFive() {}101  int __declspec(code_seg("foo_nine")) bar11(int t) { return t; }102  NonTrivialCopy f;103};104 105//CHECK: define {{.*}}0FooFive@@QAE@ABU0@@Z{{.*}} section "someother"106 107#pragma code_seg("YetAnother")108int caller4()109{110  FooFour z1;111  FooFour z2 = z1;112  FooFive y1;113  FooFive y2 = y1;114 return z2.bar10(0) + y2.bar11(1);115}116 117//CHECK: define {{.*}}bar10@FooFour{{.*}} section "foo_eight"118//CHECK: define {{.*}}bar11@FooFive{{.*}} section "foo_nine"119 120struct FooSix {121  #pragma code_seg("foo_ten")122  int bar12() { return 12; }123  #pragma code_seg("foo_eleven")124  int bar13() { return 13; }125};126 127int bar14() { return 14; }128//CHECK: define {{.*}}bar14{{.*}} section "foo_eleven"129 130int caller5()131{132  FooSix fsix;133  return fsix.bar12() + fsix.bar13();134}135 136//CHECK: define {{.*}}bar12@FooSix{{.*}} section "foo_ten"137//CHECK: define {{.*}}bar13@FooSix{{.*}} section "foo_eleven"138//CHECK: define {{.*}}baz1@FooTwo{{.*}} section "foo_four"139 140