From fe115420b17acc722033d0df0dc354c2b841a7ab Mon Sep 17 00:00:00 2001 From: xleroy Date: Tue, 19 Aug 2014 13:19:35 +0000 Subject: checklink/Check.ml: missing SDA addressing for store instructions. powerpc/PrintAsm.ml: update Linux output (Csymbol_rel, SDA sections). test/regression/sections.c: test for SDA and relative addressings. git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@2571 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e --- test/regression/Makefile | 2 +- test/regression/Results/sections | 75 ++++++++++++++++++++++++++++++++++++++++ test/regression/sections.c | 75 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 test/regression/Results/sections create mode 100644 test/regression/sections.c (limited to 'test/regression') diff --git a/test/regression/Makefile b/test/regression/Makefile index 4cf9470..bd99675 100644 --- a/test/regression/Makefile +++ b/test/regression/Makefile @@ -23,7 +23,7 @@ TESTS=int32 int64 floats floats-basics \ TESTS_COMP=attribs1 bitfields1 bitfields2 bitfields3 bitfields4 \ bitfields5 bitfields6 bitfields7 bitfields8 \ builtins-$(ARCH) packedstruct1 packedstruct2 alignas \ - varargs1 varargs2 + varargs1 varargs2 sections # Can run, both in compiled mode and in interpreter mode, # but produce processor-dependent results, so no reference output in Results diff --git a/test/regression/Results/sections b/test/regression/Results/sections new file mode 100644 index 0000000..540a839 --- /dev/null +++ b/test/regression/Results/sections @@ -0,0 +1,75 @@ +---- Absolute addressing +signed char 1: OK +signed char 2: OK +signed char 3: OK +unsigned char 1: OK +unsigned char 2: OK +unsigned char 3: OK +signed short 1: OK +signed short 2: OK +signed short 3: OK +unsigned short 1: OK +unsigned short 2: OK +unsigned short 3: OK +int 1: OK +int 2: OK +int 3: OK +float 1: OK +float 2: OK +float 3: OK +double 1: OK +double 2: OK +double 3: OK +long long 1: OK +long long 2: OK +long long 3: OK +---- Small data area +signed char 1: OK +signed char 2: OK +signed char 3: OK +unsigned char 1: OK +unsigned char 2: OK +unsigned char 3: OK +signed short 1: OK +signed short 2: OK +signed short 3: OK +unsigned short 1: OK +unsigned short 2: OK +unsigned short 3: OK +int 1: OK +int 2: OK +int 3: OK +float 1: OK +float 2: OK +float 3: OK +double 1: OK +double 2: OK +double 3: OK +long long 1: OK +long long 2: OK +long long 3: OK +---- Relative addressing +signed char 1: OK +signed char 2: OK +signed char 3: OK +unsigned char 1: OK +unsigned char 2: OK +unsigned char 3: OK +signed short 1: OK +signed short 2: OK +signed short 3: OK +unsigned short 1: OK +unsigned short 2: OK +unsigned short 3: OK +int 1: OK +int 2: OK +int 3: OK +float 1: OK +float 2: OK +float 3: OK +double 1: OK +double 2: OK +double 3: OK +long long 1: OK +long long 2: OK +long long 3: OK diff --git a/test/regression/sections.c b/test/regression/sections.c new file mode 100644 index 0000000..2e0e4e7 --- /dev/null +++ b/test/regression/sections.c @@ -0,0 +1,75 @@ +#include + +/* Testing accesses to small data area and relative addressing sections */ + +struct s { + signed char sc; + unsigned char uc; + signed short ss; + unsigned short us; + int i; + float f; + double d; + long long ll; +}; + +struct s x; /* normal absolute addressing */ + +#pragma use_section SDATA y +struct s y; /* small data area */ + +#pragma section MYDATA ".mydata" ".mydata" far-data RW +#pragma use_section MYDATA z +struct s z; /* far data area, relative addressing */ + +#define TEST(msg,ty,x,v1,v2,v3) \ + x = v1; \ + __builtin_membar(); \ + printf("%s 1: %s\n", msg, x == v1 ? "OK" : "FAILED"); \ + *((volatile ty *) &x) = v2; \ + printf("%s 2: %s\n", msg, x == v2 ? "OK" : "FAILED"); \ + x = v3; \ + printf("%s 3: %s\n", msg, *((volatile ty *) &x) == v3 ? "OK" : "FAILED"); + +/* This function must be inlined so that global addressing modes are + generated */ + +static inline void test(struct s * p) +{ + TEST("signed char", signed char, p->sc, 12, 34, 56); + TEST("unsigned char", unsigned char, p->uc, 56, 78, 123); + TEST("signed short", signed short, p->ss, 1234, 5678, 9999); + TEST("unsigned short", unsigned short, p->us, 1357, 2468, 3939); + TEST("int", int, p->i, 0x123456, 0x7890AB, 0xDEADBEEF); + TEST("float", float, p->f, 0.5f, 256.0f, 16.0f); + TEST("double", double, p->d, 3.1415, 2.718, 0.747); + TEST("long long", long long, p->ll, + 0x123456789ABCDEFLL, 0x789ABCDEF1234567LL, + 0x128934AB56CD70EFLL); +} + +void absolute(void) +{ + printf("---- Absolute addressing\n"); + test(&x); +} + +void sda(void) +{ + printf("---- Small data area\n"); + test(&y); +} + +void relative(void) +{ + printf("---- Relative addressing\n"); + test(&z); +} + +int main(void) +{ + absolute(); + sda(); + relative(); + return 0; +} -- cgit v1.2.3