]> granicus.if.org Git - clang/commitdiff
Parse/Sema: Add support for '#pragma options align=packed', which, it should be
authorDaniel Dunbar <daniel@zuster.org>
Thu, 27 May 2010 18:42:17 +0000 (18:42 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Thu, 27 May 2010 18:42:17 +0000 (18:42 +0000)
noted, is not the same as __attribute__((packed)). That would be ridiculous!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@104865 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Parse/Action.h
lib/Parse/ParsePragma.cpp
lib/Sema/SemaAttr.cpp
test/Sema/pragma-align-packed.c [new file with mode: 0644]

index d0968599c8c2139ee7430e394c65a9d572603524..122fe850a1c52b7e2d387a3040cd5ed1fe402e03 100644 (file)
@@ -2567,6 +2567,7 @@ public:
   enum PragmaOptionsAlignKind {
     POAK_Native,  // #pragma options align=native
     POAK_Natural, // #pragma options align=natural
+    POAK_Packed,  // #pragma options align=packed
     POAK_Power,   // #pragma options align=power
     POAK_Mac68k,  // #pragma options align=mac68k
     POAK_Reset    // #pragma options align=reset
index 397d816c76e46da5c798b9ff69034968854f357d..b27e655ff4295507278b6982f9656a49c335ddb8 100644 (file)
@@ -140,6 +140,8 @@ void PragmaOptionsHandler::HandlePragma(Preprocessor &PP, Token &OptionsTok) {
     Kind = Action::POAK_Native;
   else if (II->isStr("natural"))
     Kind = Action::POAK_Natural;
+  else if (II->isStr("packed"))
+    Kind = Action::POAK_Packed;
   else if (II->isStr("power"))
     Kind = Action::POAK_Power;
   else if (II->isStr("mac68k"))
index c540af2498d5a863b1d0935b5eeb489238f29a6e..fcf5bfd66933d8ad6c0068017463abf323af5875 100644 (file)
@@ -146,6 +146,13 @@ void Sema::ActOnPragmaOptionsAlign(PragmaOptionsAlignKind Kind,
     Context->setAlignment(0);
     break;
 
+    // Note that '#pragma options align=packed' is not equivalent to attribute
+    // packed, it has a different precedence relative to attribute aligned.
+  case POAK_Packed:
+    Context->push(0);
+    Context->setAlignment(1);
+    break;
+
   case POAK_Mac68k:
     // Check if the target supports this.
     if (!PP.getTargetInfo().hasAlignMac68kSupport()) {
diff --git a/test/Sema/pragma-align-packed.c b/test/Sema/pragma-align-packed.c
new file mode 100644 (file)
index 0000000..6c9b06c
--- /dev/null
@@ -0,0 +1,23 @@
+// RUN: %clang-cc1 -triple i386-apple-darwin9 -fsyntax-only -verify %s
+
+#pragma pack(push, 1)
+struct s0 {
+  char f0;
+  int  f1 __attribute__((aligned(4)));
+};
+extern int a[sizeof(struct s0) == 5 ? 1 : -1];
+#pragma pack(pop)
+
+struct __attribute__((packed)) s1 {
+  char f0;
+  int  f1 __attribute__((aligned(4)));
+};
+extern int a[sizeof(struct s1) == 8 ? 1 : -1];
+
+#pragma options align=packed
+struct s2 {
+  char f0;
+  int  f1 __attribute__((aligned(4)));
+};
+extern int a[sizeof(struct s2) == 5 ? 1 : -1];
+#pragma options align=reset