aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaDecl.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-02-17 00:57:29 +0000
committerChris Lattner <sabre@nondot.org>2009-02-17 00:57:29 +0000
commit5a0c35150102f95ab270f741cdab5907c9bd9017 (patch)
treebbbc200e48176a612d09706a71d82c3a42adf5c3 /lib/Sema/SemaDecl.cpp
parente9e6cb93afa51eee1f83abc7e2cb7d8a0453d810 (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.cpp94
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;
-}