diff options
author | Chris Lattner <sabre@nondot.org> | 2009-02-17 00:57:29 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-02-17 00:57:29 +0000 |
commit | 5a0c35150102f95ab270f741cdab5907c9bd9017 (patch) | |
tree | bbbc200e48176a612d09706a71d82c3a42adf5c3 /lib/Sema/SemaDecl.cpp | |
parent | e9e6cb93afa51eee1f83abc7e2cb7d8a0453d810 (diff) |
move attribute(packed) sema support out of SemaDecl into a new SemaAttr.cpp file.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64711 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDecl.cpp')
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 94 |
1 files changed, 0 insertions, 94 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 4f8b245ef3..70990a87a3 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -3984,97 +3984,3 @@ Sema::DeclTy *Sema::ActOnFileScopeAsmDecl(SourceLocation Loc, return FileScopeAsmDecl::Create(Context, CurContext, Loc, AsmString); } - -void Sema::ActOnPragmaPack(PragmaPackKind Kind, IdentifierInfo *Name, - ExprTy *alignment, SourceLocation PragmaLoc, - SourceLocation LParenLoc, SourceLocation RParenLoc) { - Expr *Alignment = static_cast<Expr *>(alignment); - - // If specified then alignment must be a "small" power of two. - unsigned AlignmentVal = 0; - if (Alignment) { - llvm::APSInt Val; - if (!Alignment->isIntegerConstantExpr(Val, Context) || - !Val.isPowerOf2() || - Val.getZExtValue() > 16) { - Diag(PragmaLoc, diag::warn_pragma_pack_invalid_alignment); - Alignment->Destroy(Context); - return; // Ignore - } - - AlignmentVal = (unsigned) Val.getZExtValue(); - } - - switch (Kind) { - case Action::PPK_Default: // pack([n]) - PackContext.setAlignment(AlignmentVal); - break; - - case Action::PPK_Show: // pack(show) - // Show the current alignment, making sure to show the right value - // for the default. - AlignmentVal = PackContext.getAlignment(); - // FIXME: This should come from the target. - if (AlignmentVal == 0) - AlignmentVal = 8; - Diag(PragmaLoc, diag::warn_pragma_pack_show) << AlignmentVal; - break; - - case Action::PPK_Push: // pack(push [, id] [, [n]) - PackContext.push(Name); - // Set the new alignment if specified. - if (Alignment) - PackContext.setAlignment(AlignmentVal); - break; - - case Action::PPK_Pop: // pack(pop [, id] [, n]) - // MSDN, C/C++ Preprocessor Reference > Pragma Directives > pack: - // "#pragma pack(pop, identifier, n) is undefined" - if (Alignment && Name) - Diag(PragmaLoc, diag::warn_pragma_pack_pop_identifer_and_alignment); - - // Do the pop. - if (!PackContext.pop(Name)) { - // If a name was specified then failure indicates the name - // wasn't found. Otherwise failure indicates the stack was - // empty. - Diag(PragmaLoc, diag::warn_pragma_pack_pop_failed) - << (Name ? "no record matching name" : "stack empty"); - - // FIXME: Warn about popping named records as MSVC does. - } else { - // Pop succeeded, set the new alignment if specified. - if (Alignment) - PackContext.setAlignment(AlignmentVal); - } - break; - - default: - assert(0 && "Invalid #pragma pack kind."); - } -} - -bool PragmaPackStack::pop(IdentifierInfo *Name) { - if (Stack.empty()) - return false; - - // If name is empty just pop top. - if (!Name) { - Alignment = Stack.back().first; - Stack.pop_back(); - return true; - } - - // Otherwise, find the named record. - for (unsigned i = Stack.size(); i != 0; ) { - --i; - if (Stack[i].second == Name) { - // Found it, pop up to and including this record. - Alignment = Stack[i].first; - Stack.erase(Stack.begin() + i, Stack.end()); - return true; - } - } - - return false; -} |