summaryrefslogtreecommitdiff
path: root/mcon/U/alignbytes.U
blob: dea3700b799f367600d365d709fc6ffb568ec87d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
?RCS: $Id: alignbytes.U 167 2013-05-08 17:58:00Z rmanfredi $
?RCS:
?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi
?RCS: 
?RCS: You may redistribute only under the terms of the Artistic License,
?RCS: as specified in the README file that comes with the distribution.
?RCS: You may reuse parts of this distribution only within the terms of
?RCS: that same Artistic License; a copy of which may be found at the root
?RCS: of the source tree for dist 4.0.
?RCS:
?RCS: $Log: alignbytes.U,v $
?RCS: Revision 3.0.1.2  1994/10/29  16:02:28  ram
?RCS: patch36: added ?F: line for metalint file checking
?RCS:
?RCS: Revision 3.0.1.1  1994/05/06  14:25:20  ram
?RCS: patch23: avoid ALIGNBYTES, since it conflicts on NetBSD
?RCS:
?RCS: Revision 3.0  1993/08/18  12:05:23  ram
?RCS: Baseline for dist 3.0 netwide release.
?RCS:
?MAKE:alignbytes: Assert Myread Trylink cat i_inttypes i_limits i_math
?MAKE:	-pick add $@ %<
?S:alignbytes:
?S:	This variable holds the number of bytes required to align an
?S:	arbitrary standard type. Usual values are 2, 4 and 8.
?S:.
?X: This used to be called ALIGNBYTES, but that conflicts with
?X: <machines/param.h> in NetBSD.
?C:MEM_ALIGNBYTES (ALIGNBYTES):
?C:	This symbol contains the number of bytes required to align a
?C:	double. Usual values are 2, 4 and 8.
?C:.
?H:#define MEM_ALIGNBYTES $alignbytes	/**/
?H:.
?T:alignment result
: check for alignment requirements
echo " "
case "$alignbytes" in
'')
	echo "Checking alignment constraints..." >&4

	for alignment in 8 4 2 1 16 32 error
	do
		$cat >try.c <<EOCP
#$i_inttypes I_INTTYPES
#ifdef I_INTTYPES
#include <inttypes.h>
#endif
#$i_limits I_LIMITS
#ifdef I_LIMITS
#include <limits.h>
#endif
#$i_math I_MATH
#ifdef I_MATH
#include <math.h>
#endif

union u {
	void *void_ptr;
	void (*func_ptr)(void);
	char c;
	short s;
	int i;
	long l;
	float f;
	double d;
#ifdef LLONG_MAX
	long long ll;
#else
#warning "LLONG_MAX undefined"
#endif
#if defined(HUGE_VALL)
	long double ld;
#else
#warning "HUGE_VALL undefined"
#endif
#ifdef UINT32_MAX
	uint32_t u32;
#else
#warning "UINT32_MAX undefined"
#endif
#ifdef UINT16_MAX
	uint16_t u16;
#else
#warning "UINT32_MAX undefined"
#endif
#ifdef UINT64_MAX
	uint64_t u64;
#else
#warning "UINT64_MAX undefined"
#endif
#ifdef UINTMAX_MAX
	uintmax_t m;
#else
#warning "UINTMAX_MAX undefined"
#endif
#ifdef UINTPTR_MAX
	uintptr_t up;
#else
#warning "UINTPTR_MAX undefined"
#endif
};

struct s {
	char a;
	union u b;
};

#include "static_assert.h"

int
main(void)
{
	STATIC_ASSERT($alignment == ((sizeof (struct s) - (sizeof (union u)))));
	return 0;
}
EOCP

		result=''
		set result
		eval $trylink
		case "$result" in
		"$define") break;;
		esac
	done

	case "$alignment" in
	error)	dflt='8'
		echo "(I can't seem to compile the test program...)" >&4
		;;
	*)	dflt=$alignment
		;;
	esac
;;
*) dflt="$alignbytes"
	;;
esac
rp="What is the maximum alignment in bytes required for a standard type?"
. ./myread
alignbytes="$ans"