Commit Graph

22 Commits

Author SHA1 Message Date
John McCall 0cfc51eb09 Fix the layout of bitfields in ms_struct unions: their
alignment is ignored, and they always allocate a complete
storage unit.

Also, change the dumping of AST record layouts: use the more
readable C++-style dumping even in C, include bitfield offset
information in the dump, and don't print sizeof/alignof
information for fields of record type, since we don't do so
for bases or other kinds of field.

rdar://22275433

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@245514 91177308-0d34-0410-b5e6-96231b3b80d8
2015-08-19 22:42:36 +00:00
Aaron Ballman b3ce54c645 __declspec is not a core Clang language extension. Instead, require -fms-extensions or -fborland to enable the language extension.
Note: __declspec is also temporarily enabled when compiling for a CUDA target because there are implementation details relying on __declspec(property) support currently. When those details change, __declspec should be disabled for CUDA targets.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@238238 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-26 19:44:52 +00:00
Nathan Sidwell b5a0f8e884 PR6037
Warn on inaccessible direct base


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@226423 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-19 01:44:02 +00:00
David Majnemer a129dbbe1d MS ABI: Correct layout for empty records
Empty records do not always have size equivalent to their alignment.
They only do so when their alignment is at least as large as the minimum
empty struct size: 1 byte in C++ and 4 bytes in C.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@218661 91177308-0d34-0410-b5e6-96231b3b80d8
2014-09-30 06:45:43 +00:00
David Majnemer 9160039db5 AST: Propagate 'AlignIsRequired' though many levels of typedefs
A typedef of a typedef should have AlignIsRequired if *either* typedef
has an AlignAttr attached to it.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@214698 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-04 05:11:01 +00:00
David Majnemer 7c8f94e3d5 MS ABI: Consider alignment attributes on typedefs for layout
The MS ABI has a notion of 'required alignment' for fields; this
alignment supercedes pragma pack directives.

MSVC takes into account alignment attributes on typedefs when
determining whether or not a field has a certain required alignment.

Do the same in clang by tracking whether or not we saw such an attribute
when calculating the type's bitwidth and alignment.

This fixes PR20418.

Reviewers: rnk

Differential Revision: http://reviews.llvm.org/D4714

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@214274 91177308-0d34-0410-b5e6-96231b3b80d8
2014-07-30 01:30:47 +00:00
David Majnemer 1c5822aa6a MS ABI: Padding injected between empty vbases doesn't up required align
Only alignment is changed, not required alignment.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@213217 91177308-0d34-0410-b5e6-96231b3b80d8
2014-07-17 00:55:19 +00:00
David Majnemer 07a2449f96 MS ABI: Up the required alignment after inserting padding between vbases
We would correctly insert sufficiently aligned padding between vbases
when our leading base was empty, however we would neglect to increase
the required alignment of the most derived class.

This fixes PR20315.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@213123 91177308-0d34-0410-b5e6-96231b3b80d8
2014-07-16 07:16:58 +00:00
Warren Hunt 854cecb0a4 [MS-ABI] Update virtual base padding rules to match MSVC 10+
In version 9 (VS2010) (and prior)? versions of msvc, if the last field 
in a record was a bitfield padding equal to the size of the storage 
class of that bitfield was added before each vbase and vtordisp.  This 
patch removes that feature from clang and updates the lit tests to 
reflect it. 



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@206004 91177308-0d34-0410-b5e6-96231b3b80d8
2014-04-11 00:14:09 +00:00
Warren Hunt 10b2c5623b [MS-ABI] Fixed __declspec(align()) on bitfields under #pragma pack.
When __declspec(align()) is applied to a bitfield it affects the 
alignment rather than the required alignment of the struct.  The major 
feature that this patch adds is that the alignment of the structure 
obeys the alignment of __declspec(align()) from the bitfield over the 
value specified in pragma pack.

Test cases are included.
The patch also includes some small cleanups in recordlayoutbuilder and 
some cleanups to some lit tests, including line endings (but no 
functionality change to lit tests)


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@205994 91177308-0d34-0410-b5e6-96231b3b80d8
2014-04-10 22:15:18 +00:00
David Majnemer 17453db05d MS ABI: Fix some layout tests
Some lines intended to be used for testing x86_64 ABI compatibility were
not firing because lines were annotated with the wrong FileCheck prefix:
X64 vs C64


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@201453 91177308-0d34-0410-b5e6-96231b3b80d8
2014-02-15 01:09:56 +00:00
David Majnemer 10dbcf4aad MS ABI: vptr injection should obey alignment requirements
vptr injection must inject padding equivalent to the alignment of the
most aligned non-virtual subobject, not the alignment of the enclosing
record.

To fascilitate this change, don't let record layout observe the
alignment of the record until we've injected our vptrs. Also, do not
allow the alignment of vbases to affect required alignment until just
before we insert the vtordisp field.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@201199 91177308-0d34-0410-b5e6-96231b3b80d8
2014-02-12 00:43:02 +00:00
David Majnemer 853b30a610 MS ABI: Fix some layout tests
Some lines intended to be used for testing x86_64 ABI compatibility were
not firing because lines were annotated with the wrong FileCheck prefix:
X64 vs x64

N.B. Changes beyond just changing x64 to X64 were made, presumably
because other parts of the layout engine have changed.  I've verified
the changes to make sure that MSVC creates a compatible layout.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@200670 91177308-0d34-0410-b5e6-96231b3b80d8
2014-02-03 00:29:57 +00:00
Hans Wennborg 11b1b8ab36 Remove the -cxx-abi command-line flag.
This makes the C++ ABI depend entirely on the target: MS ABI for -win32 triples,
Itanium otherwise. It's no longer possible to do weird combinations.

To be able to run a test with a specific ABI without constraining it to a
specific triple, new substitutions are added to lit: %itanium_abi_triple and
%ms_abi_triple can be used to get the current target triple adjusted to the
desired ABI. For example, if the test suite is running with the i686-pc-win32
target, %itanium_abi_triple will expand to i686-pc-mingw32.

Differential Revision: http://llvm-reviews.chandlerc.com/D2545

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@199250 91177308-0d34-0410-b5e6-96231b3b80d8
2014-01-14 19:35:09 +00:00
Warren Hunt af1a29eae2 [ms-abi] Small Change to pack+alignment interaction.
This patch makes a small behavioral change to the interaction between 
pack and alignment.  Specifically it makes __declspec(align()) on a 
field change that field's alignment without respect to pack but the 
alignment change to the record alignment as a whole still obeys pack.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@199172 91177308-0d34-0410-b5e6-96231b3b80d8
2014-01-14 00:54:36 +00:00
Warren Hunt d18d1517f6 [ms-abi] Reordering __declspec(align) pragma pack handling
This patch moves the check for pragma pack until after the application 
of __declspec align to before pragma pack.  This causes observable 
changes in the use of tail padding for bases.  A test case is included.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@199154 91177308-0d34-0410-b5e6-96231b3b80d8
2014-01-13 22:25:55 +00:00
Warren Hunt c3a5420a77 [ms-abi] Change the way alignment is tracked
This patch more cleanly seperates the concepts of Preferred Alignment 
and Required Alignment.  Most notable that changes to Required Alignment 
do *not* impact preferred alignment until late in struct layout.  This 
is observable when using pragma pack and non-virtual bases and the use 
of tail padding when laying them out.

Test cases included.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@198988 91177308-0d34-0410-b5e6-96231b3b80d8
2014-01-11 01:16:40 +00:00
Warren Hunt d7f64c9ed6 [ms-abi] Handle __declspec(align) on bitfields "properly"
__declspec(align), when applied to bitfields affects their perferred 
alignment instead of their required alignment.  We don't know why.  
Also, #pragma pack(n) turns packing *off* if n is greater than the 
pointer size.  This is now observable because of the impact of 
declspec(align) on bitfields.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@198907 91177308-0d34-0410-b5e6-96231b3b80d8
2014-01-10 01:28:05 +00:00
Warren Hunt ed121420c2 [ms-abi] Refactor Microsoft Record Layout
This patch refactors microsoft record layout to be more "natural".  The 
most dominant change is that vbptrs and vfptrs are injected after the 
fact.  This simplifies the implementation and the math for the offest 
for the first base/field after the vbptr.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@198818 91177308-0d34-0410-b5e6-96231b3b80d8
2014-01-09 00:30:56 +00:00
Warren Hunt a99cea3d48 [ms-abi] Fixes improperly sized vfptrs with pragma pack
With pragma pack, the layout engine would produce vfptrs that were 
packed width rather than pointer width.  This patch addresses the issue 
and adds a test case.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@198059 91177308-0d34-0410-b5e6-96231b3b80d8
2013-12-26 22:09:12 +00:00
Warren Hunt 6ab1e94114 [ms-abi] Makes Virtual Base Alignment Look at All Virtual Bases
Prior to this patch, the alignment imposed by virtual bases only 
included direct virtual bases.  This patch fixes it to look at all 
virtual bases.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@196997 91177308-0d34-0410-b5e6-96231b3b80d8
2013-12-11 02:21:03 +00:00
Warren Hunt 5ec042b219 Support MS-ABI's concept of "Required Alignment" imposed by
__declspec(align())

This patch implements required alignment in a way that makes 
__declspec(align()) and #pragma pack play correctly together. In the 
MS-ABI, __declspec(align()) is a hard rule and cannot be overridden by 
#pragma pack. This cases each record to have two interesting alignments 
"preferred alignment" (which matches Itanium's concept of alignment) and 
"required alignment" which is an alignment that must never be violated, 
even in the case of #pragma pack. This patch introduces the concept of 
Required Alignment to the record builder and tracks/uses it 
appropriately. Test cases are included.

Differential Revision: http://llvm-reviews.chandlerc.com/D2283



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@196549 91177308-0d34-0410-b5e6-96231b3b80d8
2013-12-06 00:01:17 +00:00