зеркало из https://github.com/microsoft/clang-1.git
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:
Родитель
c76702cc80
Коммит
9f21f89c32
|
@ -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,8 +5407,7 @@ 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),
|
||||
|
|
Загрузка…
Ссылка в новой задаче