]> rtime.felk.cvut.cz Git - omk.git/blob - tests/cmetric
RTEMS rules: provide support to build application with symbols exported.
[omk.git] / tests / cmetric
1 #!/bin/bash
2
3 . ./wvtest.sh
4
5 cat > 'correct_cmetric_config.h' <<EOF
6 /* Automatically generated from for_cmetric_config.o */
7 /* Conditionals to control compilation */
8 /* Defines from the values defined to symbols in hexadecimal format */
9 #define FLAG_BAR_b 0x01
10 #define FLAG_BAR_m 0x02
11 #define FLAG_FOO_b 0x0
12 #define FLAG_FOO_m 0x01
13 #define VALUE_HEX 0x07b
14 #define o_blah_field1 0x0
15 #define o_blah_field2 0x04
16 #define o_blah_flags 0x08
17 #define s_blah_field1 0x04
18 #define s_blah_field2 0x01
19 #define s_blah_flags 0x04
20 /* Defines from the values defined to symbols in decimal format */
21 #define VALUE_DEC 123
22 #define VALUE_DEC_ZERO 0
23 EOF
24 cat > 'Makefile.omk' <<EOF
25 # -*- makefile -*-
26
27 NM=nm
28
29 cmetric_include_HEADERS = test/cmetric_config.h
30 cmetric_config_CMETRIC_SOURCES = for_cmetric_config.c
31
32 bin_PROGRAMS = test
33 test_SOURCES = test.S
34 EOF
35 cat > 'for_cmetric_config.c' <<EOF
36 /* Export of offset information to assembly source code */
37
38 /* %N (for N a digit) means print operand N in usual manner.
39    %lN label name with no punctuation
40    %cN constant expression with no punctuation
41    %aN means expect operand N to be a memory address
42        (not a memory reference!) and print a reference
43        to that address.
44    %nN constant expression for minus the value with no other punctuation.
45  */
46
47 #include "header.h"
48
49 #define NUM2ASM(sym,val) \
50     __asm__ ( \
51         ".set " #sym ",%c0\n" \
52         ".global " #sym "\n" \
53         ::"n"(val) \
54     )
55
56 #define FIELD2ASM(strct, fld)                              \
57         NUM2ASM(_cmetric2def_o_##strct##_##fld,&((struct strct*)0L)->fld); \
58         NUM2ASM(_cmetric2def_s_##strct##_##fld,sizeof(((struct strct*)0L)->fld))
59
60 #define MASKBIT2ASM(def_base) \
61         NUM2ASM(_cmetric2def_##def_base##_b,def_base##_b); \
62         NUM2ASM(_cmetric2def_##def_base##_m,def_base##_m)
63
64 #define VALUE2ASM(value_name,value) \
65         NUM2ASM(_cmetric2def_##value_name,value)
66
67 #define DEC_VALUE2ASM(value_name,value) \
68         NUM2ASM(_cmetric2defdec_##value_name,value)
69
70 void pxmc_public2asm(void)
71 {
72
73 #ifdef CONFIG_TEST_OPTION1
74 VALUE2ASM(CMETRIC_TEST_OPTION1,1);
75 #endif
76 #ifdef CONFIG_TEST_OPTION2
77 VALUE2ASM(CMETRIC_TEST_OPTION2,1);
78 #endif
79 #ifdef CONFIG_TEST_OPTION3
80 VALUE2ASM(CMETRIC_TEST_OPTION3,1);
81 #endif
82 #ifdef CONFIG_TEST_OPTION4
83 VALUE2ASM(CMETRIC_TEST_OPTION4,1);
84 #endif
85 #ifdef CONFIG_TEST_OPTION5
86 VALUE2ASM(CMETRIC_TEST_OPTION5,1);
87 #endif
88 #ifdef CONFIG_TEST_OPTION6
89 VALUE2ASM(CMETRIC_TEST_OPTION6,1);
90 #endif
91
92 VALUE2ASM(VALUE_HEX, 123);
93 DEC_VALUE2ASM(VALUE_DEC, 123);
94 DEC_VALUE2ASM(VALUE_DEC_ZERO, 0);
95
96 MASKBIT2ASM(FLAG_FOO);
97 MASKBIT2ASM(FLAG_BAR);
98
99 FIELD2ASM(blah, field1);
100 FIELD2ASM(blah, field2);
101 FIELD2ASM(blah, flags);
102
103 }
104 EOF
105 cat > 'test.S' <<EOF
106 #include <test/cmetric_config.h>
107
108 /*
109  * In this file, we can use the symbols extracted from .o generated by
110  * a C compiler
111  */
112
113 .global main
114 main:
115 EOF
116 cat > 'header.h' <<EOF
117 #ifndef HEADER_H
118 #define HEADER_H
119
120 #define FLAG_FOO_b 0
121 #define FLAG_FOO_m (1<<FLAG_FOO_b)
122 #define FLAG_BAR_b 1
123 #define FLAG_BAR_m (1<<FLAG_BAR_b)
124
125 struct blah {
126         int field1;
127         char field2;
128         int flags;
129 };
130
131 #endif
132 EOF
133
134
135 touch config.omk-default
136 needs_valid_CC
137
138 WVFAIL make NM=false FAILMSG="cmetric error was not correctly detected"
139 WVPASS make FAILMSG="compilation error"
140
141 eval $(make omk-get-var VAR=COMPILED_DIR_NAME|grep ^COMPILED_DIR_NAME)
142
143 WVPASS diff -u correct_cmetric_config.h $COMPILED_DIR_NAME/include/test/cmetric_config.h