diff options
author | Daniel Dunbar <daniel@zuster.org> | 2010-05-27 18:42:09 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2010-05-27 18:42:09 +0000 |
commit | 663e8094aeb03d60ff29eb8863943f194d3e3aa1 (patch) | |
tree | 3e9650bd94685a5ddda1086f0fd421e9668a6c4b | |
parent | 47bb3e2ba14460f39a3ed3d066f7161efc78193a (diff) | |
download | bcm5719-llvm-663e8094aeb03d60ff29eb8863943f194d3e3aa1.tar.gz bcm5719-llvm-663e8094aeb03d60ff29eb8863943f194d3e3aa1.zip |
Parse/Sema: Add support for '#pragma options align=native'.
llvm-svn: 104864
-rw-r--r-- | clang/include/clang/Parse/Action.h | 1 | ||||
-rw-r--r-- | clang/lib/Parse/ParsePragma.cpp | 8 | ||||
-rw-r--r-- | clang/lib/Sema/SemaAttr.cpp | 4 | ||||
-rw-r--r-- | clang/test/Sema/pragma-pack-and-options-align.c | 8 |
4 files changed, 18 insertions, 3 deletions
diff --git a/clang/include/clang/Parse/Action.h b/clang/include/clang/Parse/Action.h index e21da81a8aa..d0968599c8c 100644 --- a/clang/include/clang/Parse/Action.h +++ b/clang/include/clang/Parse/Action.h @@ -2565,6 +2565,7 @@ public: //===---------------------------- Pragmas -------------------------------===// enum PragmaOptionsAlignKind { + POAK_Native, // #pragma options align=native POAK_Natural, // #pragma options align=natural POAK_Power, // #pragma options align=power POAK_Mac68k, // #pragma options align=mac68k diff --git a/clang/lib/Parse/ParsePragma.cpp b/clang/lib/Parse/ParsePragma.cpp index c4e4a525e56..397d816c76e 100644 --- a/clang/lib/Parse/ParsePragma.cpp +++ b/clang/lib/Parse/ParsePragma.cpp @@ -110,7 +110,7 @@ void PragmaPackHandler::HandlePragma(Preprocessor &PP, Token &PackTok) { LParenLoc, RParenLoc); } -// #pragma 'options' 'align' '=' {'natural', 'mac68k', 'power', 'reset'} +// #pragma 'options' 'align' '=' {'native','natural','mac68k','power','reset'} void PragmaOptionsHandler::HandlePragma(Preprocessor &PP, Token &OptionsTok) { SourceLocation OptionsLoc = OptionsTok.getLocation(); @@ -120,7 +120,7 @@ void PragmaOptionsHandler::HandlePragma(Preprocessor &PP, Token &OptionsTok) { PP.Diag(Tok.getLocation(), diag::warn_pragma_options_expected_align); return; } - + PP.Lex(Tok); if (Tok.isNot(tok::equal)) { PP.Diag(Tok.getLocation(), diag::warn_pragma_options_expected_equal); @@ -136,7 +136,9 @@ void PragmaOptionsHandler::HandlePragma(Preprocessor &PP, Token &OptionsTok) { Action::PragmaOptionsAlignKind Kind = Action::POAK_Natural; const IdentifierInfo *II = Tok.getIdentifierInfo(); - if (II->isStr("natural")) + if (II->isStr("native")) + Kind = Action::POAK_Native; + else if (II->isStr("natural")) Kind = Action::POAK_Natural; else if (II->isStr("power")) Kind = Action::POAK_Power; diff --git a/clang/lib/Sema/SemaAttr.cpp b/clang/lib/Sema/SemaAttr.cpp index 82978c95605..c540af2498d 100644 --- a/clang/lib/Sema/SemaAttr.cpp +++ b/clang/lib/Sema/SemaAttr.cpp @@ -137,6 +137,10 @@ void Sema::ActOnPragmaOptionsAlign(PragmaOptionsAlignKind Kind, // We don't support #pragma options align=power. switch (Kind) { + // For all targets we support native and natural are the same. + // + // FIXME: This is not true on Darwin/PPC. + case POAK_Native: case POAK_Natural: Context->push(0); Context->setAlignment(0); diff --git a/clang/test/Sema/pragma-pack-and-options-align.c b/clang/test/Sema/pragma-pack-and-options-align.c index c880ed6305b..ebf1adee02f 100644 --- a/clang/test/Sema/pragma-pack-and-options-align.c +++ b/clang/test/Sema/pragma-pack-and-options-align.c @@ -16,6 +16,14 @@ struct s1 { }; extern int a[sizeof(struct s1) == 8 ? 1 : -1]; +#pragma options align=reset +#pragma options align=native +struct s1_1 { + char c; + int x; +}; +extern int a[sizeof(struct s1_1) == 8 ? 1 : -1]; + #pragma pack(pop) struct s2 { char c; |