Commit Graph

259 Commits

Author SHA1 Message Date
Fariborz Jahanian 783243b3ca Implenment #pack pragma and ms_struct attribute layout.
Concludes // radar://8823265.

llvm-svn: 131188
2011-05-11 16:58:31 +00:00
Fariborz Jahanian 07ceb0a1a4 Support pack pragma and ms_struct attributes. // rdar://8823265
llvm-svn: 131142
2011-05-10 19:00:50 +00:00
Fariborz Jahanian 7adbed6b4d 'long long' requires special treatment in ms_struct
structs (impacts 32-bit only though).

llvm-svn: 131103
2011-05-09 22:03:17 +00:00
Fariborz Jahanian 307eace474 In ms_struct structs, Establish a new alignment for a
non-bitfield following a bitfield if size of their types differ.

llvm-svn: 131032
2011-05-06 22:42:22 +00:00
Fariborz Jahanian b7a2879677 Establish a new alignment for an ms_struct bitfield following
a non-bitfield if size of their types differ.

llvm-svn: 131023
2011-05-06 21:56:12 +00:00
Fariborz Jahanian 84335f7c8e More ms_struct bitfield stuff:
Adjacent bit fields are packed into the same 1-, 2-, or
4-byte allocation unit if the integral types are the same
size. // rdar://8823265.

llvm-svn: 130851
2011-05-04 18:51:37 +00:00
Fariborz Jahanian 759e4a1add Only the first zero-length bitfield decides alignment of
the followup data member in an ms_struct struct.
// rdar:// 8823265

llvm-svn: 130795
2011-05-03 22:07:14 +00:00
Fariborz Jahanian fc0fe6eb52 Finish off rules for z-length bitfields in ms_struct
structs. // rdar://8823265

llvm-svn: 130783
2011-05-03 20:21:04 +00:00
Fariborz Jahanian eb39741c0b More rule enforcement of zero bitfields for ms_struct.
llvm-svn: 130696
2011-05-02 17:20:56 +00:00
Fariborz Jahanian 595ec5d43c Some refactoring of my ms_struct patch.
// rdar://8823265 related.

llvm-svn: 130311
2011-04-27 17:14:21 +00:00
Fariborz Jahanian bcb23a180b With ms_struct attribut, Zero-length bitfields following
non-bitfield members are ignore. // rdar://8823265 wip

llvm-svn: 130257
2011-04-26 23:52:16 +00:00
Ted Kremenek 022dbc1672 Simplify crash recovery cleanup registration.
llvm-svn: 128057
2011-03-22 01:15:19 +00:00
Ted Kremenek f75d089679 Recover memory from RecordLayoutBuilders during crashes.
llvm-svn: 127931
2011-03-19 01:00:36 +00:00
Ken Dyck a1a2e8decb Instead of round up sizes to '8', round them up to the alignment of the char
type.

llvm-svn: 127391
2011-03-10 02:00:35 +00:00
Ken Dyck e73807538a Round up the non-virtual size to the next char instead of rounding down.
llvm-svn: 127390
2011-03-10 01:53:59 +00:00
Ken Dyck dbe37f38d0 Use CharUnits for TypeAlign variable in LayoutWideBitField(). No change in
functionality intended.

llvm-svn: 126730
2011-03-01 01:36:00 +00:00
Ken Dyck aab635e67a Change the return type of GetVirtualPointersSize() to CharUnits. No change
in functionality intended.

llvm-svn: 126727
2011-03-01 01:22:45 +00:00
Ken Dyck 1b4420ed42 Retry r126357. Use CharUnits for the Size and DataSize calculations when
they are known to be exact multiples of the width of the char type. Add a
test case to CodeGen/union.c that would have caught the problem with the
previous attempt. No change in functionality intended.

llvm-svn: 126628
2011-02-28 02:01:38 +00:00
Daniel Dunbar 30cdc7022b Revert "Use CharUnits values for Size and DataSize outside of the bitfield
layout", it broke some GCC tests.

llvm-svn: 126386
2011-02-24 16:40:53 +00:00
Ken Dyck 8e74e79145 Use CharUnits values for Size and DataSize outside of the bitfield layout
methods, when they are known to be exact multiples of the width of the char
type. 

llvm-svn: 126357
2011-02-24 02:12:14 +00:00
Ken Dyck 3c215f2fd1 Use Context.getCharWidth() in place of literal '8's in assertions.
llvm-svn: 126356
2011-02-24 01:33:05 +00:00
Ken Dyck ecfc75529f Make the Size and DataSize members more CharUnits-friendly by wrapping them
with getter and setter methods in both bit units and CharUnits. This will help
simplify some of the unit mismatch in the parts of the code where sizes are
known to be exact multiples of the width of the char type.

Assertions in the getters help guard against accidentally converting to
CharUnits when sizes are not exact multiples of the char width.

llvm-svn: 126354
2011-02-24 01:13:28 +00:00
Ken Dyck 6d90e8937c Expand use of CharUnits in LayoutField(). No change in functionality
intended.

llvm-svn: 126066
2011-02-20 02:06:09 +00:00
Ken Dyck 85ef0431a7 Expand use of CharUnits for alignments further. No change in functionality
intended.

llvm-svn: 126034
2011-02-19 18:58:07 +00:00
Ken Dyck 02ced6fd19 Convert MaxFieldAlignment to CharUnits from bits. No change in functionality
intended.

llvm-svn: 125704
2011-02-17 01:49:42 +00:00
Ken Dyck 1300b3b357 Convert the UnpackedAlignment field to CharUnits from bits. No change in
functionality intended.

llvm-svn: 125643
2011-02-16 02:11:31 +00:00
Ken Dyck 4731d5b65a Convert Alignment member to CharUnits from bits. No change in functionality
intended.

llvm-svn: 125641
2011-02-16 02:05:21 +00:00
Ken Dyck af1c83fbe7 Convert NonVirtualSize to CharUnits from bits. No change in functionality
intended.

llvm-svn: 125639
2011-02-16 01:52:01 +00:00
Ken Dyck a2d3dda041 Convert NonVirtualAlignment to CharUnits. No change in functionality
intended.

llvm-svn: 125638
2011-02-16 01:43:15 +00:00
Ken Dyck 7ad11e70b6 Convert RecordLayout::Alignment to CharUnits from bit units. No change in
functionality intended. 

llvm-svn: 125549
2011-02-15 02:32:40 +00:00
Ken Dyck d5090c16f8 Convert RecordLayout::DataSize to CharUnits from bits, eliminating two
unnecessary calls to RoundUpToAlignment. No changes to functionality
intended.

llvm-svn: 125356
2011-02-11 02:20:09 +00:00
Ken Dyck b0fcc59e19 Add a helper function, ASTContext::toBits(), that converts sizes in
CharUnits to sizes in bits, and use it to tidy up the places where the
conversion was done explicitly.

llvm-svn: 125332
2011-02-11 01:54:29 +00:00
Ken Dyck c8ae55050d Convert RecordLayout::Size to CharUnits from bits. No changes to
functionality intended.

llvm-svn: 125156
2011-02-09 01:59:34 +00:00
Ken Dyck bec0285d7f Convert RecordLayout::NonVirtualAlign to CharUnits. No change in
functionality intended.

llvm-svn: 125069
2011-02-08 02:02:47 +00:00
Fariborz Jahanian 09b2331cf7 For gcc compatibility, size of a class which is zero
but has non-empty data fields, such as array of zero length,
remains zero.
// rdar://8945175

llvm-svn: 124741
2011-02-02 19:36:18 +00:00
Douglas Gregor dbe3927026 Basic support for -mms-bitfields, from Carl Norum!
llvm-svn: 124661
2011-02-01 15:15:22 +00:00
Ken Dyck 316d6f69bc Convert RecordLayout::NonVirtualSize from bit units to CharUnits.
llvm-svn: 124646
2011-02-01 01:52:10 +00:00
Ken Dyck 7c4026bea7 Remove private toCharUnits() helper method, replacing with calls to
ASTContext::toCharUnitsFromBits().

llvm-svn: 124092
2011-01-24 01:28:50 +00:00
Ken Dyck 86a7fcc19c Replace calls to CharUnits::fromQuantity() with ones
ASTContext::toCharUnitsFromBits() when converting from bit sizes to char units.

llvm-svn: 123715
2011-01-18 01:56:16 +00:00
Jay Foad 39c7980772 PR3558: mark "logically const" accessor methods in ASTContext as const,
and mark the fields they use as mutable. This allows us to remove a few
const_casts.

llvm-svn: 123314
2011-01-12 09:06:06 +00:00
Rafael Espindola 7bcde197d7 Fix PR8796.
The problem was that we were asserting the we never added an empty class
to the same offset twice. This is not true for unions, where two members, empty
or not, can have the some offset.

llvm-svn: 122633
2010-12-29 23:02:58 +00:00
Argyrios Kyrtzidis d62c9be4fc Fix another unnecessary-struct-padding issue.
llvm-svn: 121352
2010-12-09 02:47:58 +00:00
Argyrios Kyrtzidis 8b54274fcf Before determining the effect the alignment of base struct will have in the aligment of the sub-struct,
take into account if the sub-struct is packed and its maximum field alignment.

Fixes rdar://8745206

llvm-svn: 121335
2010-12-09 00:35:20 +00:00
Anders Carlsson 60a6263ee8 Move isNearlyEmpty out into the ASTContext so it can be called from CodeGen as well.
llvm-svn: 120137
2010-11-25 01:51:53 +00:00
Anders Carlsson 7f95cd1817 Rename RecordLayout::getPrimaryBaseWasVirtual to isPrimaryBaseVirtual.
llvm-svn: 120133
2010-11-24 23:12:57 +00:00
Anders Carlsson 5adde29d86 Use the newly added function in ASTRecordLayoutBuilder.
llvm-svn: 120131
2010-11-24 22:55:48 +00:00
Argyrios Kyrtzidis d004064864 Refactoring of Diagnostic class.
-Move the stuff of Diagnostic related to creating/querying diagnostic IDs into a new DiagnosticIDs class.
-DiagnosticIDs can be shared among multiple Diagnostics for multiple translation units.
-The rest of the state in Diagnostic object is considered related and tied to one translation unit.
-Have Diagnostic point to the SourceManager that is related with. Diagnostic can now accept just a
   SourceLocation instead of a FullSourceLoc.
-Reflect the changes to various interfaces.

llvm-svn: 119730
2010-11-18 20:06:41 +00:00
Anders Carlsson 09814d3f3a Don't update empty field subobjects for bitfields. Fixes PR8519.
llvm-svn: 117921
2010-11-01 15:14:51 +00:00
Anders Carlsson 0a14ee9ed8 Get rid of more calls to getBaseClassOffsetInBits.
llvm-svn: 117883
2010-11-01 00:21:58 +00:00
Anders Carlsson 3f01871647 Port over a couple of getVBaseClassOffsetInBits call sites to use getVBaseClassOffset instead.
llvm-svn: 117882
2010-10-31 23:45:59 +00:00
Anders Carlsson fd88a6160d Rename getBaseClassOffset to getBaseClassOffsetInBits and introduce a getBaseClassOffset which returns the offset in CharUnits. Do the same thing for getVBaseClassOffset.
llvm-svn: 117881
2010-10-31 23:22:37 +00:00
Anders Carlsson a2f8e41a0a Start converting over the RecordLayoutBuilder next.
llvm-svn: 117878
2010-10-31 22:20:42 +00:00
Anders Carlsson 28466ab8f4 EmptyObjectMap now uses CharUnits wherever possible.
llvm-svn: 117877
2010-10-31 22:13:23 +00:00
Anders Carlsson 233e272775 More CharUnits conversion.
llvm-svn: 117875
2010-10-31 21:54:55 +00:00
Anders Carlsson 725190ff3f More CharUnits conversion.
llvm-svn: 117874
2010-10-31 21:39:24 +00:00
Anders Carlsson f8f756d1d5 Use CharUnits in the EmptyClassOffsets map.
llvm-svn: 117873
2010-10-31 21:22:43 +00:00
Anders Carlsson 22f5720c27 Baby steps towards using only CharUnits for base class offsets in ASTRecordLayout. Start by storing the offsets in CharUnits in the ASTRecordLayout object.
llvm-svn: 117869
2010-10-31 21:01:46 +00:00
Benjamin Kramer 2fc373e155 Move classes into anonymous namespaces.
llvm-svn: 117104
2010-10-22 16:33:16 +00:00
Argyrios Kyrtzidis 6843141d39 Store in PCH the key function of C++ class to avoid deserializing the complete declaration context in order to compute it.
Progress for rdar://7260160.

llvm-svn: 116508
2010-10-14 20:14:38 +00:00
Argyrios Kyrtzidis 8c64bbe032 Embrace C++ ABI 5.2.6 and consider that template instantiations don't have key functions (same as GCC).
llvm-svn: 116391
2010-10-13 02:39:41 +00:00
Argyrios Kyrtzidis ca0d0cd3b9 Implement -Wpadded and -Wpacked.
-Wpadded warns when undesired padding is introduced in a struct. (rdar://7469556)
-Wpacked warns if a struct is given the packed attribute, but the packed attribute has no effect
  on the layout or the size of the struct. Such structs may be mis-aligned for little benefit.

The warnings are emitted at the point where layout is calculated, that is at RecordLayoutBuilder.
To avoid calculating the layouts of all structs regardless of whether they are needed or not,
I let the layouts be lazily constructed when needed. This has the disadvantage that the above warnings
will be emitted only when they are used for IR gen, and not e.g with -fsyntax-only:

$ cat t.c
struct S {
  char c;
  int i;
};
void f(struct S* s) {}

$ clang -fsyntax-only -Wpadded t.c
$ clang -c -Wpadded t.c -o t.o
t.c:3:7: warning: padding struct 'struct S' with 3 bytes to align 'i' [-Wpadded]
  int i;
      ^
1 warning generated.

This is a good tradeoff between providing the warnings and not calculating layouts for all
structs in case the user has enabled a couple of rarely used warnings.

llvm-svn: 114544
2010-09-22 14:32:24 +00:00
Argyrios Kyrtzidis 3c6cd17c8a Use a smart pointer instead of delete.
llvm-svn: 112005
2010-08-25 00:32:14 +00:00
Chandler Carruth 76c0cb493f Add a virtual destructor to the base of another class hierarchy with virtual
methods.

llvm-svn: 111804
2010-08-23 08:37:21 +00:00
Charles Davis 6bcb07ad71 Add some enum goodness as requested by Chris. Now instead of storing the
active C++ ABI as a raw string, we store it as an enum. This should improve
performance somewhat.

And yes, this time, I started from a clean build directory, and
all the tests passed. :)

llvm-svn: 111507
2010-08-19 02:18:14 +00:00
John McCall 1ed0182413 Restore the build
llvm-svn: 111498
2010-08-19 01:21:57 +00:00
Charles Davis c2c576a9e7 Add a special RecordLayoutBuilder for the Microsoft C++ ABI.
All it does right now is add space for two vtable pointers instead of one
when a class has both virtual methods and virtual bases. This is a requirement
of the Microsoft ABI, since it has separate vtables for methods and bases. Other
stuff will come up over time, but we'll cross those bridges when we get to
them.

llvm-svn: 111493
2010-08-19 00:55:19 +00:00
Alexis Hunt dcfba7b35b Generate Attr subclasses with TableGen.
Now all classes derived from Attr are generated from TableGen.
Additionally, Attr* is no longer its own linked list; SmallVectors or
Attr* are used. The accompanying LLVM commit contains the updates to
TableGen necessary for this.

Some other notes about newly-generated attribute classes:

 - The constructor arguments are a SourceLocation and a Context&,
   followed by the attributes arguments in the order that they were
   defined in Attr.td

 - Every argument in Attr.td has an appropriate accessor named getFoo,
   and there are sometimes a few extra ones (such as to get the length
   of a variadic argument).

Additionally, specific_attr_iterator has been introduced, which will
iterate over an AttrVec, but only over attributes of a certain type. It
can be accessed through either Decl::specific_attr_begin/end or
the global functions of the same name.

llvm-svn: 111455
2010-08-18 23:23:40 +00:00
Daniel Dunbar 56df97761d StringRef'ication of lots stuff, patch by Peter Davies!
llvm-svn: 111314
2010-08-17 22:39:59 +00:00
Argyrios Kyrtzidis 499e6e49e7 Remove ATTRIBUTE_UNUSED from the common pattern of disallowing copying.
llvm-svn: 111101
2010-08-15 10:17:39 +00:00
Argyrios Kyrtzidis 0a33cb62a6 Add ATTRIBUTE_UNUSED to methods not supposed to be used.
llvm-svn: 111087
2010-08-15 01:15:27 +00:00
Daniel Dunbar f35e76552f Sema: Fix a subtle i64 -> i32 truncation which broke layout of large structures
with bit-fields.

llvm-svn: 107185
2010-06-29 18:34:35 +00:00
Jeffrey Yasskin bb219e01a6 Delete assert in ComputeKeyFunction. The function runs fine without it, since
there's an explicit guard on isPolymorphic, and virtual bases don't affect the
key function calculation.  This allows people to call
ASTContext::getKeyFunction on arbitrary classes.

llvm-svn: 107143
2010-06-29 15:27:35 +00:00
Anders Carlsson cc59cc5d80 Do the same short-circuit optimization when laying out bases.
llvm-svn: 105920
2010-06-13 18:00:18 +00:00
Anders Carlsson ae111dc821 Implement part of the EmptySubobjectMap optimization described in PR6998. We still need to do this for bases.
llvm-svn: 105919
2010-06-13 17:49:16 +00:00
Anders Carlsson 446872069f Correctly handle fields with virtual bases containing empty subobjects.
llvm-svn: 105628
2010-06-08 19:09:24 +00:00
Anders Carlsson 45c1d2898e When checking whether we can place a base subobject at an offset, we don't need to go past the highest offset that's known to contain an empty base subobject.
llvm-svn: 105611
2010-06-08 16:20:35 +00:00
Anders Carlsson cc5de097a6 Minor cleanups to the empty subobject map.
llvm-svn: 105608
2010-06-08 15:56:03 +00:00
Anders Carlsson 7498b32117 And now for the best part: Removing the old code.
llvm-svn: 105162
2010-05-30 06:56:46 +00:00
Anders Carlsson b1fcdd063c Turn on the new empty base subobject tracking code. It's a bit faster than the previous code. However, it still has quadratic performance, something which I intend to fix shortly in a subsequent patch.
llvm-svn: 105161
2010-05-30 06:52:33 +00:00
Anders Carlsson a7774a685d Cleanup.
llvm-svn: 105114
2010-05-29 21:10:24 +00:00
Anders Carlsson a60b86a3fa Make EmptySubobjectMap::CanPlaceBaseAtOffset take a BaseSubobjectInfo as well.
llvm-svn: 105113
2010-05-29 20:49:49 +00:00
Anders Carlsson d7f3fcf248 Change RecordLayoutBuilder::LayoutBase to take a BaseSubobjectInfo. No functionality change.
llvm-svn: 105112
2010-05-29 20:47:33 +00:00
Anders Carlsson 6b0d914ad0 Rework the way virtual primary bases are added when laying out classes. Instead of doing it as a separate step, we now use the BaseSubobjectInfo and use it when laying out the bases. This fixes a bug where we would either not add a primary virtual base at all, or add it at the wrong offset.
llvm-svn: 105110
2010-05-29 19:44:50 +00:00
Anders Carlsson d6ff5d7787 Change LayoutVirtualBase to also take a BaseSubobjectInfo.
llvm-svn: 105104
2010-05-29 17:48:36 +00:00
Anders Carlsson bb0e6787b0 Change RecordLayoutBuilder::LayoutNonVirtualBase to take a BaseSubobjectInfo. No functionality change.
llvm-svn: 105103
2010-05-29 17:42:25 +00:00
Anders Carlsson e3c24c7033 Move computing the base subobject info for a class into the RecordLayoutBuilder because we're going to need it to be able to correctly add offsets for primary virtual bases.
llvm-svn: 105102
2010-05-29 17:35:14 +00:00
Anders Carlsson a7f3cdb0f2 Rename BaseInfo to BaseSubobjectInfo.
llvm-svn: 105007
2010-05-28 21:24:37 +00:00
Anders Carlsson 056818f8a2 Move BaseInfo outside of the EmptySubobject class.
llvm-svn: 105002
2010-05-28 21:13:31 +00:00
Anders Carlsson db319761e7 More work on the empty subobject map. This code is not yet used.
llvm-svn: 104861
2010-05-27 18:20:57 +00:00
Daniel Dunbar 6da1098b4b Sema: Add initial support for '#pragma options align=mac68k'.
- Docs are fairly sketchy, if someone wants to pore through gcc to look for
   holes I'd appreciate any failing test cases!

llvm-svn: 104809
2010-05-27 05:45:51 +00:00
Anders Carlsson 439edd1aea More work on the new empty subobject map.
llvm-svn: 104808
2010-05-27 05:41:06 +00:00
Daniel Dunbar 592a85c137 Strip trailing whitespace.
llvm-svn: 104801
2010-05-27 02:25:46 +00:00
Daniel Dunbar 401304462a AST: Rename PragmaPackAttr to MaxFieldAlignmentAttr, which is more accurate.
llvm-svn: 104795
2010-05-27 01:12:46 +00:00
Anders Carlsson c121b4e59f More work on the empty subobjects map.
llvm-svn: 104787
2010-05-27 00:07:01 +00:00
Anders Carlsson c5ca1f7799 Move ComputeEmptySubobjectSizes to EmptySubobjectMap.
llvm-svn: 104702
2010-05-26 15:54:25 +00:00
Anders Carlsson f58de11b61 Stub out the EmptySubobjectsMap class.
llvm-svn: 104701
2010-05-26 15:32:58 +00:00
Anders Carlsson ce7f77729a Inline the RecordLayoutBuilder constructor.
llvm-svn: 104700
2010-05-26 15:20:08 +00:00
Anders Carlsson c28a6c9251 Add a Layout overload that takes a CXXRecordDecl.
llvm-svn: 104695
2010-05-26 15:10:00 +00:00
Benjamin Kramer c7656cdf83 Move RecordLayoutBuilder into an anonymous namespace.
llvm-svn: 104693
2010-05-26 09:58:31 +00:00
Anders Carlsson c222620adf Rename ASTRecordLayoutBuilder to RecordLayoutBuilder.
llvm-svn: 104688
2010-05-26 05:58:59 +00:00