1  /* { dg-options "-fPIE -mpic-data-text-rel -save-temps" } */
       2  /* { dg-do run } */
       3  
       4  #define TEST_VAR(var,val) (var) = (val); if( (var) != (val)) return 0;
       5  
       6  int foo(unsigned int i);
       7  extern void abort(void);
       8  extern void exit(int);
       9  
      10  unsigned char data[8];
      11  long bigData[7];
      12  long var;
      13  typedef struct {int a; short b; long c[1000][1000]; long long d[3][3]; char e; } myDef;
      14  myDef def;
      15  const char* myString;
      16  
      17  /* { dg-final { scan-assembler "mfs\tr20,rpc" } } */
      18  /* { dg-final { scan-assembler "addik\tr20,r20,8@TXTPCREL" } } */
      19  /* { dg-final { scan-assembler ",r20,\[^\n]*var\[^\n]*@TXTREL" } } */
      20  /* { dg-final { scan-assembler-not ",r0,\[^\n]*var" } } */
      21  /* { dg-final { scan-assembler ",r20,\[^\n]*bigData\[^\n]*@TXTREL" } } */
      22  /* { dg-final { scan-assembler-not ",r0,\[^\n]*bigData" } } */
      23  /* { dg-final { scan-assembler ",r20,\[^\n]*def\[^\n]*@TXTREL" } } */
      24  /* { dg-final { scan-assembler-not ",r0,\[^\n]*def" } } */
      25  /* { dg-final { scan-assembler ",r20,\[^\n]*data\[^\n]*@TXTREL" } } */
      26  /* { dg-final { scan-assembler-not ",r0,\[^\n]*data" } } */
      27  /* { dg-final { scan-assembler ",r20,\[^\n]*L\[^\n]*@TXTREL" } } */
      28  /* { dg-final { scan-assembler-not ",r0,\[^\n]*L" } } */
      29  
      30  
      31  
      32  void foo2() {
      33  	var++;
      34  }
      35  
      36  int foo (unsigned int i) {
      37  
      38  	TEST_VAR(var,123)
      39  	TEST_VAR(data[i],77)
      40  	TEST_VAR(data[2],88)
      41  	TEST_VAR(def.a,897)
      42  	TEST_VAR(bigData[i],78)
      43  	TEST_VAR(bigData[2],777)
      44  	TEST_VAR(def.b,12333);
      45  	TEST_VAR(def.c[i][i],5);
      46  	TEST_VAR(def.c[0][1],7);
      47  	TEST_VAR(def.d[1][2],123);
      48  	TEST_VAR(def.e,7);
      49  	TEST_VAR(bigData[i+1],bigData[i*2]);
      50  
      51  	foo2();
      52  
      53  	myString = "Hello";
      54  
      55  	switch(i){
      56  
      57  	case 1: var += 2; break;
      58  	case 2: var += 3; break;
      59  	case 3: var += 5; break;
      60  	case 4: var += 7; break;
      61  	case 5: var += 8; break;
      62  	default: var = 0;
      63  
      64  	}
      65  
      66  	return 1;
      67  
      68  }
      69  
      70  int main() {
      71  
      72  	int result = foo(3);
      73  	if(result != 1 || var != 129) {
      74  		abort();
      75  	}
      76  
      77  	exit(0);
      78  
      79  }
      80  
      81  /* { dg-options "-fPIE -mpic-data-is-text-relative -save-temps" } */
      82  /* { dg-do run } */
      83  
      84  #define TEST_VAR(var,val) (var) = (val); if( (var) != (val)) return 0;
      85  
      86  int foo(unsigned int i);
      87  extern void abort(void);
      88  extern void exit(int);
      89  
      90  unsigned char data[8];
      91  long bigData[7];
      92  long var;
      93  typedef struct {int a; short b; long c[1000][1000]; long long d[3][3]; char e; } myDef;
      94  myDef def;
      95  const char* myString;
      96  
      97  /* { dg-final { scan-assembler "mfs\tr20,rpc" } } */
      98  /* { dg-final { scan-assembler "addik\tr20,r20,8@TXTPCREL" } } */
      99  /* { dg-final { scan-assembler ",r20,\[^\n]*var\[^\n]*@TXTREL" } } */
     100  /* { dg-final { scan-assembler-not ",r0,\[^\n]*var" } } */
     101  /* { dg-final { scan-assembler ",r20,\[^\n]*bigData\[^\n]*@TXTREL" } } */
     102  /* { dg-final { scan-assembler-not ",r0,\[^\n]*bigData" } } */
     103  /* { dg-final { scan-assembler ",r20,\[^\n]*def\[^\n]*@TXTREL" } } */
     104  /* { dg-final { scan-assembler-not ",r0,\[^\n]*def" } } */
     105  /* { dg-final { scan-assembler ",r20,\[^\n]*data\[^\n]*@TXTREL" } } */
     106  /* { dg-final { scan-assembler-not ",r0,\[^\n]*data" } } */
     107  /* { dg-final { scan-assembler ",r20,\[^\n]*L\[^\n]*@TXTREL" } } */
     108  /* { dg-final { scan-assembler-not ",r0,\[^\n]*L" } } */
     109  
     110  
     111  
     112  void foo2() {
     113  	var++;
     114  }
     115  
     116  int foo (unsigned int i) {
     117  
     118  	TEST_VAR(var,123)
     119  	TEST_VAR(data[i],77)
     120  	TEST_VAR(data[2],88)
     121  	TEST_VAR(def.a,897)
     122  	TEST_VAR(bigData[i],78)
     123  	TEST_VAR(bigData[2],777)
     124  	TEST_VAR(def.b,12333);
     125  	TEST_VAR(def.c[i][i],5);
     126  	TEST_VAR(def.c[0][1],7);
     127  	TEST_VAR(def.d[1][2],123);
     128  	TEST_VAR(def.e,7);
     129  	TEST_VAR(bigData[i+1],bigData[i*2]);
     130  
     131  	foo2();
     132  
     133  	myString = "Hello";
     134  
     135  	switch(i){
     136  
     137  	case 1: var += 2; break;
     138  	case 2: var += 3; break;
     139  	case 3: var += 5; break;
     140  	case 4: var += 7; break;
     141  	case 5: var += 8; break;
     142  	default: var = 0;
     143  
     144  	}
     145  
     146  	return 1;
     147  
     148  }
     149  
     150  int main() {
     151  
     152  	int result = foo(3);
     153  	if(result != 1 || var != 129) {
     154  		abort();
     155  	}
     156  
     157  	exit(0);
     158  
     159  }
     160