Sema: Replace getPragmaPackAlignment with AddAlignmentAttributesForRecord, which

exposes less details.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@104797 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Daniel Dunbar 2010-05-27 01:53:40 +00:00
Родитель c76702cc80
Коммит 9f21f89c32
3 изменённых файлов: 18 добавлений и 17 удалений

Просмотреть файл

@ -4050,9 +4050,9 @@ public:
SourceLocation WeakNameLoc,
SourceLocation AliasNameLoc);
/// getPragmaPackAlignment() - Return the current alignment as specified by
/// the current #pragma pack directive, or 0 if none is currently active.
unsigned getPragmaPackAlignment() const;
/// AddAlignmentAttributesForRecord - Adds any needed alignment attributes to
/// a the record decl, to handle '#pragma pack' and '#pragma options align'.
void AddAlignmentAttributesForRecord(RecordDecl *RD);
/// FreePackedContext - Deallocate and null out PackContext.
void FreePackedContext();

Просмотреть файл

@ -88,12 +88,16 @@ void Sema::FreePackedContext() {
PackContext = 0;
}
/// getPragmaPackAlignment() - Return the current alignment as specified by
/// the current #pragma pack directive, or 0 if none is currently active.
unsigned Sema::getPragmaPackAlignment() const {
if (PackContext)
return static_cast<PragmaPackStack*>(PackContext)->getAlignment();
return 0;
void Sema::AddAlignmentAttributesForRecord(RecordDecl *RD) {
// If there is no pack context, we don't need any attributes.
if (!PackContext)
return;
PragmaPackStack *Stack = static_cast<PragmaPackStack*>(PackContext);
// Otherwise, check to see if we need a max field alignment attribute.
if (unsigned Alignment = Stack->getAlignment())
RD->addAttr(::new (Context) MaxFieldAlignmentAttr(Alignment * 8));
}
void Sema::ActOnPragmaOptionsAlign(PragmaOptionsAlignKind Kind,

Просмотреть файл

@ -5397,11 +5397,9 @@ CreateNewDecl:
Invalid = true;
}
if (Kind != TTK_Enum) {
// Handle #pragma pack: if the #pragma pack stack has non-default
// alignment, make up a packed attribute for this decl. These
// attributes are checked when the ASTContext lays out the
// structure.
if (RecordDecl *RD = dyn_cast<RecordDecl>(New)) {
// Add alignment attributes if necessary; these attributes are checked when
// the ASTContext lays out the structure.
//
// It is important for implementing the correct semantics that this
// happen here (in act on tag decl). The #pragma pack stack is
@ -5409,15 +5407,14 @@ CreateNewDecl:
// many points during the parsing of a struct declaration (because
// the #pragma tokens are effectively skipped over during the
// parsing of the struct).
if (unsigned Alignment = getPragmaPackAlignment())
New->addAttr(::new (Context) MaxFieldAlignmentAttr(Alignment * 8));
AddAlignmentAttributesForRecord(RD);
}
// If this is a specialization of a member class (of a class template),
// check the specialization.
if (isExplicitSpecialization && CheckMemberSpecialization(New, Previous))
Invalid = true;
if (Invalid)
New->setInvalidDecl();