r299226 - [Modules][PCH] Serialize #pragma pack

Duncan P. N. Exon Smith via cfe-commits cfe-commits at lists.llvm.org
Fri Apr 14 17:25:40 PDT 2017


FYI, I reverted the modules side of this in r300380.  For details, see the commit message.  TL;DR: this didn't actually make modules builds closer to matching non-modules builds, thanks to how submodules work; on the contrary, it made them diverge.

> On 2017-Mar-31, at 08:36, Alex Lorenz via cfe-commits <cfe-commits at lists.llvm.org> wrote:
> 
> Author: arphaman
> Date: Fri Mar 31 10:36:21 2017
> New Revision: 299226
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=299226&view=rev
> Log:
> [Modules][PCH] Serialize #pragma pack
> 
> This patch serializes the state of #pragma pack. It preserves the state of the
> pragma from a PCH/from modules in a file that uses that PCH/those modules.
> 

> rdar://21359084
> 
> Differential Revision: https://reviews.llvm.org/D31241
> 
> Added:
>    cfe/trunk/test/Modules/Inputs/pragma_pack_push.h
>    cfe/trunk/test/Modules/Inputs/pragma_pack_reset_push.h
>    cfe/trunk/test/Modules/Inputs/pragma_pack_set.h
>    cfe/trunk/test/Modules/pragma-pack.c
>    cfe/trunk/test/PCH/pragma-pack.c
> Modified:
>    cfe/trunk/include/clang/Serialization/ASTBitCodes.h
>    cfe/trunk/include/clang/Serialization/ASTReader.h
>    cfe/trunk/include/clang/Serialization/ASTWriter.h
>    cfe/trunk/lib/Sema/SemaAttr.cpp
>    cfe/trunk/lib/Serialization/ASTReader.cpp
>    cfe/trunk/lib/Serialization/ASTWriter.cpp
>    cfe/trunk/test/Modules/Inputs/module.map
> 
> Modified: cfe/trunk/include/clang/Serialization/ASTBitCodes.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=299226&r1=299225&r2=299226&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Serialization/ASTBitCodes.h (original)
> +++ cfe/trunk/include/clang/Serialization/ASTBitCodes.h Fri Mar 31 10:36:21 2017
> @@ -604,6 +604,9 @@ namespace clang {
>       OPENCL_EXTENSION_DECLS = 59,
> 
>       MODULAR_CODEGEN_DECLS = 60,
> +
> +      /// \brief Record code for \#pragma pack options.
> +      PACK_PRAGMA_OPTIONS = 61,
>     };
> 
>     /// \brief Record types used within a source manager block.
> 
> Modified: cfe/trunk/include/clang/Serialization/ASTReader.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=299226&r1=299225&r2=299226&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Serialization/ASTReader.h (original)
> +++ cfe/trunk/include/clang/Serialization/ASTReader.h Fri Mar 31 10:36:21 2017
> @@ -811,6 +811,17 @@ private:
>   int PragmaMSPointersToMembersState = -1;
>   SourceLocation PointersToMembersPragmaLocation;
> 
> +  /// \brief The pragma pack state.
> +  Optional<unsigned> PragmaPackCurrentValue;
> +  SourceLocation PragmaPackCurrentLocation;
> +  struct PragmaPackStackEntry {
> +    unsigned Value;
> +    SourceLocation Location;
> +    StringRef SlotLabel;
> +  };
> +  llvm::SmallVector<PragmaPackStackEntry, 2> PragmaPackStack;
> +  llvm::SmallVector<std::string, 2> PragmaPackStrings;
> +
>   /// \brief The OpenCL extension settings.
>   OpenCLOptions OpenCLExtensions;
> 
> 
> Modified: cfe/trunk/include/clang/Serialization/ASTWriter.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTWriter.h?rev=299226&r1=299225&r2=299226&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Serialization/ASTWriter.h (original)
> +++ cfe/trunk/include/clang/Serialization/ASTWriter.h Fri Mar 31 10:36:21 2017
> @@ -485,6 +485,7 @@ private:
>   void WriteOptimizePragmaOptions(Sema &SemaRef);
>   void WriteMSStructPragmaOptions(Sema &SemaRef);
>   void WriteMSPointersToMembersPragmaOptions(Sema &SemaRef);
> +  void WritePackPragmaOptions(Sema &SemaRef);
>   void WriteModuleFileExtension(Sema &SemaRef,
>                                 ModuleFileExtensionWriter &Writer);
> 
> 
> Modified: cfe/trunk/lib/Sema/SemaAttr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaAttr.cpp?rev=299226&r1=299225&r2=299226&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaAttr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaAttr.cpp Fri Mar 31 10:36:21 2017
> @@ -215,6 +215,7 @@ void Sema::PragmaStack<ValueType>::Act(S
>                                        ValueType Value) {
>   if (Action == PSK_Reset) {
>     CurrentValue = DefaultValue;
> +    CurrentPragmaLocation = PragmaLocation;
>     return;
>   }
>   if (Action & PSK_Push)
> 
> Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=299226&r1=299225&r2=299226&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReader.cpp Fri Mar 31 10:36:21 2017
> @@ -3298,6 +3298,28 @@ ASTReader::ReadASTBlock(ModuleFile &F, u
>       }
>       ForceCUDAHostDeviceDepth = Record[0];
>       break;
> +
> +    case PACK_PRAGMA_OPTIONS: {
> +      if (Record.size() < 3) {
> +        Error("invalid pragma pack record");
> +        return Failure;
> +      }
> +      PragmaPackCurrentValue = Record[0];
> +      PragmaPackCurrentLocation = ReadSourceLocation(F, Record[1]);
> +      unsigned NumStackEntries = Record[2];
> +      unsigned Idx = 3;
> +      // Reset the stack when importing a new module.
> +      PragmaPackStack.clear();
> +      for (unsigned I = 0; I < NumStackEntries; ++I) {
> +        PragmaPackStackEntry Entry;
> +        Entry.Value = Record[Idx++];
> +        Entry.Location = ReadSourceLocation(F, Record[Idx++]);
> +        PragmaPackStrings.push_back(ReadString(Record, Idx));
> +        Entry.SlotLabel = PragmaPackStrings.back();
> +        PragmaPackStack.push_back(Entry);
> +      }
> +      break;
> +    }
>     }
>   }
> }
> @@ -7419,6 +7441,34 @@ void ASTReader::UpdateSema() {
>         PointersToMembersPragmaLocation);
>   }
>   SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth;
> +
> +  if (PragmaPackCurrentValue) {
> +    // The bottom of the stack might have a default value. It must be adjusted
> +    // to the current value to ensure that the packing state is preserved after
> +    // popping entries that were included/imported from a PCH/module.
> +    bool DropFirst = false;
> +    if (!PragmaPackStack.empty() &&
> +        PragmaPackStack.front().Location.isInvalid()) {
> +      assert(PragmaPackStack.front().Value == SemaObj->PackStack.DefaultValue &&
> +             "Expected a default alignment value");
> +      SemaObj->PackStack.Stack.emplace_back(
> +          PragmaPackStack.front().SlotLabel, SemaObj->PackStack.CurrentValue,
> +          SemaObj->PackStack.CurrentPragmaLocation);
> +      DropFirst = true;
> +    }
> +    for (const auto &Entry :
> +         llvm::makeArrayRef(PragmaPackStack).drop_front(DropFirst ? 1 : 0))
> +      SemaObj->PackStack.Stack.emplace_back(Entry.SlotLabel, Entry.Value,
> +                                            Entry.Location);
> +    if (PragmaPackCurrentLocation.isInvalid()) {
> +      assert(*PragmaPackCurrentValue == SemaObj->PackStack.DefaultValue &&
> +             "Expected a default alignment value");
> +      // Keep the current values.
> +    } else {
> +      SemaObj->PackStack.CurrentValue = *PragmaPackCurrentValue;
> +      SemaObj->PackStack.CurrentPragmaLocation = PragmaPackCurrentLocation;
> +    }
> +  }
> }
> 
> IdentifierInfo *ASTReader::get(StringRef Name) {
> 
> Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=299226&r1=299225&r2=299226&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Fri Mar 31 10:36:21 2017
> @@ -4170,6 +4170,20 @@ void ASTWriter::WriteMSPointersToMembers
>   Stream.EmitRecord(POINTERS_TO_MEMBERS_PRAGMA_OPTIONS, Record);
> }
> 
> +/// \brief Write the state of 'pragma pack' at the end of the module.
> +void ASTWriter::WritePackPragmaOptions(Sema &SemaRef) {
> +  RecordData Record;
> +  Record.push_back(SemaRef.PackStack.CurrentValue);
> +  AddSourceLocation(SemaRef.PackStack.CurrentPragmaLocation, Record);
> +  Record.push_back(SemaRef.PackStack.Stack.size());
> +  for (const auto &StackEntry : SemaRef.PackStack.Stack) {
> +    Record.push_back(StackEntry.Value);
> +    AddSourceLocation(StackEntry.PragmaLocation, Record);
> +    AddString(StackEntry.StackSlotLabel, Record);
> +  }
> +  Stream.EmitRecord(PACK_PRAGMA_OPTIONS, Record);
> +}
> +
> void ASTWriter::WriteModuleFileExtension(Sema &SemaRef,
>                                          ModuleFileExtensionWriter &Writer) {
>   // Enter the extension block.
> @@ -4860,6 +4874,7 @@ ASTFileSignature ASTWriter::WriteASTCore
>     WriteMSStructPragmaOptions(SemaRef);
>     WriteMSPointersToMembersPragmaOptions(SemaRef);
>   }
> +  WritePackPragmaOptions(SemaRef);
> 
>   // Some simple statistics
>   RecordData::value_type Record[] = {
> 
> Modified: cfe/trunk/test/Modules/Inputs/module.map
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/module.map?rev=299226&r1=299225&r2=299226&view=diff
> ==============================================================================
> --- cfe/trunk/test/Modules/Inputs/module.map (original)
> +++ cfe/trunk/test/Modules/Inputs/module.map Fri Mar 31 10:36:21 2017
> @@ -265,6 +265,22 @@ module diag_pragma {
>   header "diag_pragma.h"
> }
> 
> +module pragma_pack_set {
> +  header "pragma_pack_set.h"
> +}
> +
> +module pragma_pack_push {
> +  header "pragma_pack_push.h"
> +}
> +
> +module pragma_pack_empty {
> +  header "empty.h"
> +}
> +
> +module pragma_pack_reset_push {
> +  header "pragma_pack_reset_push.h"
> +}
> +
> module dummy {
>   header "dummy.h"
> }
> 
> Added: cfe/trunk/test/Modules/Inputs/pragma_pack_push.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/pragma_pack_push.h?rev=299226&view=auto
> ==============================================================================
> --- cfe/trunk/test/Modules/Inputs/pragma_pack_push.h (added)
> +++ cfe/trunk/test/Modules/Inputs/pragma_pack_push.h Fri Mar 31 10:36:21 2017
> @@ -0,0 +1,6 @@
> +
> +#pragma pack (push, 4)
> +#pragma pack (push, 2)
> +#pragma pack (push, 1)
> +#pragma pack (pop)
> +
> 
> Added: cfe/trunk/test/Modules/Inputs/pragma_pack_reset_push.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/pragma_pack_reset_push.h?rev=299226&view=auto
> ==============================================================================
> --- cfe/trunk/test/Modules/Inputs/pragma_pack_reset_push.h (added)
> +++ cfe/trunk/test/Modules/Inputs/pragma_pack_reset_push.h Fri Mar 31 10:36:21 2017
> @@ -0,0 +1,4 @@
> +
> +#pragma pack ()
> +#pragma pack (push, 4)
> +
> 
> Added: cfe/trunk/test/Modules/Inputs/pragma_pack_set.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/pragma_pack_set.h?rev=299226&view=auto
> ==============================================================================
> --- cfe/trunk/test/Modules/Inputs/pragma_pack_set.h (added)
> +++ cfe/trunk/test/Modules/Inputs/pragma_pack_set.h Fri Mar 31 10:36:21 2017
> @@ -0,0 +1,3 @@
> +
> +#pragma pack (1)
> +
> 
> Added: cfe/trunk/test/Modules/pragma-pack.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/pragma-pack.c?rev=299226&view=auto
> ==============================================================================
> --- cfe/trunk/test/Modules/pragma-pack.c (added)
> +++ cfe/trunk/test/Modules/pragma-pack.c Fri Mar 31 10:36:21 2017
> @@ -0,0 +1,35 @@
> +// RUN: rm -rf %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fmodules -fimplicit-module-maps -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=pragma_pack_set %S/Inputs/module.map
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fmodules -fimplicit-module-maps -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=pragma_pack_push %S/Inputs/module.map
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fmodules -fimplicit-module-maps -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=pragma_pack_empty %S/Inputs/module.map
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fmodules -fimplicit-module-maps -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=pragma_pack_reset_push %S/Inputs/module.map
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fmodules -fimplicit-module-maps -x objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s
> +// FIXME: When we have a syntax for modules in C, use that.
> +
> + at import pragma_pack_set;
> +
> +#pragma pack (show) // expected-warning {{value of #pragma pack(show) == 1}}
> +#pragma pack (pop) // expected-warning {{#pragma pack(pop, ...) failed: stack empty}}
> +
> + at import pragma_pack_push;
> +
> +#pragma pack (show) // expected-warning {{value of #pragma pack(show) == 2}}
> +#pragma pack (pop)
> +#pragma pack (show) // expected-warning {{value of #pragma pack(show) == 4}}
> +#pragma pack (pop)
> +#pragma pack (show) // expected-warning {{value of #pragma pack(show) == 1}}
> +#pragma pack (pop) // expected-warning {{#pragma pack(pop, ...) failed: stack empty}}
> +
> +#pragma pack (16)
> +
> + at import pragma_pack_empty;
> +
> +#pragma pack (show) // expected-warning {{value of #pragma pack(show) == 16}}
> +#pragma pack (pop) // expected-warning {{#pragma pack(pop, ...) failed: stack empty}}
> +
> + at import pragma_pack_reset_push;
> +
> +#pragma pack (show) // expected-warning {{value of #pragma pack(show) == 4}}
> +#pragma pack (pop)
> +#pragma pack (show) // expected-warning {{value of #pragma pack(show) == 8}}
> +
> 
> Added: cfe/trunk/test/PCH/pragma-pack.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/pragma-pack.c?rev=299226&view=auto
> ==============================================================================
> --- cfe/trunk/test/PCH/pragma-pack.c (added)
> +++ cfe/trunk/test/PCH/pragma-pack.c Fri Mar 31 10:36:21 2017
> @@ -0,0 +1,90 @@
> +// Test this without pch.
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify -fsyntax-only -DSET
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify -fsyntax-only -DRESET
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify -fsyntax-only -DPUSH
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify -fsyntax-only -DPUSH_POP
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -include %s -verify -fsyntax-only -DPUSH_POP_LABEL
> +
> +// Test with pch.
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DSET -emit-pch -o %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DSET -verify -include-pch %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DRESET -emit-pch -o %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DRESET -verify -include-pch %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DPUSH -emit-pch -o %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DPUSH -verify -include-pch %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DPUSH_POP -emit-pch -o %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DPUSH_POP -verify -include-pch %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DPUSH_POP_LABEL -emit-pch -o %t
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -DPUSH_POP_LABEL -verify -include-pch %t
> +
> +#ifndef HEADER
> +#define HEADER
> +
> +#ifdef SET
> +#pragma pack(1)
> +#endif
> +
> +#ifdef RESET
> +#pragma pack(2)
> +#pragma pack ()
> +#endif
> +
> +#ifdef PUSH
> +#pragma pack(1)
> +#pragma pack (push, 2)
> +#endif
> +
> +#ifdef PUSH_POP
> +#pragma pack (push, 4)
> +#pragma pack (push, 2)
> +#pragma pack (pop)
> +#endif
> +
> +#ifdef PUSH_POP_LABEL
> +#pragma pack (push, a, 4)
> +#pragma pack (push, b, 1)
> +#pragma pack (push, c, 2)
> +#pragma pack (pop, b)
> +#endif
> +
> +#else
> +
> +#ifdef SET
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 1}}
> +#pragma pack(pop) // expected-warning {{#pragma pack(pop, ...) failed: stack empty}}
> +#endif
> +
> +#ifdef RESET
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 8}}
> +#pragma ()
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 8}}
> +#endif
> +
> +#ifdef PUSH
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 2}}
> +#pragma pack(pop)
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 1}}
> +#pragma pack ()
> +#pragma pack (show) // expected-warning {{value of #pragma pack(show) == 8}}
> +#pragma pack(pop) // expected-warning {{#pragma pack(pop, ...) failed: stack empty}}
> +#endif
> +
> +#ifdef PUSH_POP
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 4}}
> +#pragma pack(pop)
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 8}}
> +#pragma pack(pop) // expected-warning {{#pragma pack(pop, ...) failed: stack empty}}
> +#endif
> +
> +#ifdef PUSH_POP_LABEL
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 4}}
> +#pragma pack(pop, c)
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 4}}
> +#pragma pack(pop, a)
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 8}}
> +#pragma pack(pop)  // expected-warning {{#pragma pack(pop, ...) failed: stack empty}}
> +#pragma pack(pop, b) // expected-warning {{#pragma pack(pop, ...) failed: stack empty}}
> +#pragma pack(show) // expected-warning {{value of #pragma pack(show) == 8}}
> +#endif
> +
> +#endif
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list