/* script_test_12a.c -- a test case for gold

   Copyright (C) 2015-2021 Free Software Foundation, Inc.
   Written by Cary Coutant <ccoutant@gmail.com>.

   This file is part of gold.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.

   This tests linker script behavior, that gold distinguishes correctly
   between
      *(.x1) *(.x2) *(.x3)
   and
      *(.x1 .x2 .x3)
   in an input section spec. In the first case, the output section
   should contain all .x1 sections, followed by all .x2 sections,
   then all .x3 sections; i.e.:
      script_test_12a.o(.x1)
      script_test_12b.o(.x1)
      script_test_12a.o(.x2)
      script_test_12b.o(.x2)
      script_test_12a.o(.x3)
      script_test_12b.o(.x3)
   
   In the second case, the output section should interleave the
   .x1, .x2, and .x3 sections in the order seen; i.e.:
      script_test_12a.o(.x1)
      script_test_12a.o(.x2)
      script_test_12a.o(.x3)
      script_test_12b.o(.x1)
      script_test_12b.o(.x2)
      script_test_12b.o(.x3)

   The linker scripts set the absolute symbol INTERLEAVED, which we
   test here to determine which ordering to expect. The scripts also
   define the symbols test_array_start and test_array_end.
*/

extern int test_array_start;
extern int test_array_end;
extern char interleaved __attribute__((__aligned__(1)));

int
main(void)
{
  int last = 0;
  int *p;
  long should_be_interleaved = (long)&interleaved;
  int mask = (should_be_interleaved == 1 ? 0x7f : 0xff);
  for (p = &test_array_start; p < &test_array_end; ++p)
    {
      int next = *p & mask;
      if (next <= last)
	return 1;
      last = next;
    }
  return 0;
}

int a1[] __attribute((section(".x1"))) = { 0x01, 0x02, 0x03, 0x04 };
int a2[] __attribute((section(".x2"))) = { 0x11, 0x12, 0x13, 0x14};
int a3[] __attribute((section(".x3"))) = { 0x21, 0x22, 0x23, 0x24 };
int a4[] __attribute((section(".x4"))) = { 0xff, 0xff, 0xff, 0xff };
