From f7fa634887cf327ebca2a71327631ee00f0057a8 Mon Sep 17 00:00:00 2001 From: Andrey Bokhanko Date: Fri, 15 Apr 2016 08:03:51 +0000 Subject: [PATCH] [MSVC Compat] Implementation of __unaligned (MS extension) as a type qualifier This patch implements __unaligned as a type qualifier; before that, it was modeled as an attribute. Proper mangling of __unaligned is implemented as well. Some OpenCL code/tests are tangenially affected, as they relied on existing number and sizes of type qualifiers. Differential Revision: http://reviews.llvm.org/D18596 llvm-svn: 266415 --- clang/include/clang/AST/Type.h | 34 ++++++++++++------ clang/include/clang/Basic/AddressSpaces.h | 2 +- clang/include/clang/Basic/Attr.td | 4 --- clang/include/clang/Sema/DeclSpec.h | 24 +++++++++---- clang/include/clang/Sema/Sema.h | 3 +- clang/lib/AST/MicrosoftMangle.cpp | 5 +++ clang/lib/AST/TypePrinter.cpp | 6 ++++ clang/lib/Parse/ParseDecl.cpp | 15 +++++--- clang/lib/Parse/ParseTentative.cpp | 2 +- clang/lib/Sema/DeclSpec.cpp | 6 ++-- clang/lib/Sema/SemaCodeComplete.cpp | 3 ++ clang/lib/Sema/SemaDecl.cpp | 7 ++++ clang/lib/Sema/SemaDeclObjC.cpp | 1 + clang/lib/Sema/SemaExpr.cpp | 2 +- clang/lib/Sema/SemaType.cpp | 31 +++++++++------- clang/test/CodeGenCXX/mangle-ms-cxx11.cpp | 11 ++++++ clang/test/Sema/MicrosoftExtensions.c | 8 +++++ clang/test/Sema/address_spaces.c | 4 +-- .../invalid-assignment-constant-address-space.c | 2 +- clang/test/SemaCXX/MicrosoftExtensions.cpp | 41 +++++++++++++++++++++- 20 files changed, 163 insertions(+), 48 deletions(-) diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 71004fc..a13f595 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -152,8 +152,8 @@ public: enum { /// The maximum supported address space number. - /// 24 bits should be enough for anyone. - MaxAddressSpace = 0xffffffu, + /// 23 bits should be enough for anyone. + MaxAddressSpace = 0x7fffffu, /// The width of the "fast" qualifier mask. FastWidth = 3, @@ -265,6 +265,13 @@ public: Mask |= mask; } + bool hasUnaligned() const { return Mask & UMask; } + void setUnaligned(bool flag) { + Mask = (Mask & ~UMask) | (flag ? UMask : 0); + } + void removeUnaligned() { Mask &= ~UMask; } + void addUnaligned() { Mask |= UMask; } + bool hasObjCGCAttr() const { return Mask & GCAttrMask; } GC getObjCGCAttr() const { return GC((Mask & GCAttrMask) >> GCAttrShift); } void setObjCGCAttr(GC type) { @@ -433,7 +440,9 @@ public: // ObjC lifetime qualifiers must match exactly. getObjCLifetime() == other.getObjCLifetime() && // CVR qualifiers may subset. - (((Mask & CVRMask) | (other.Mask & CVRMask)) == (Mask & CVRMask)); + (((Mask & CVRMask) | (other.Mask & CVRMask)) == (Mask & CVRMask)) && + // U qualifier may superset. + (!(other.Mask & UMask) || (Mask & UMask)); } /// \brief Determines if these qualifiers compatibly include another set of @@ -501,16 +510,19 @@ public: private: - // bits: |0 1 2|3 .. 4|5 .. 7|8 ... 31| - // |C R V|GCAttr|Lifetime|AddressSpace| + // bits: |0 1 2|3|4 .. 5|6 .. 8|9 ... 31| + // |C R V|U|GCAttr|Lifetime|AddressSpace| uint32_t Mask; - static const uint32_t GCAttrMask = 0x18; - static const uint32_t GCAttrShift = 3; - static const uint32_t LifetimeMask = 0xE0; - static const uint32_t LifetimeShift = 5; - static const uint32_t AddressSpaceMask = ~(CVRMask|GCAttrMask|LifetimeMask); - static const uint32_t AddressSpaceShift = 8; + static const uint32_t UMask = 0x8; + static const uint32_t UShift = 3; + static const uint32_t GCAttrMask = 0x30; + static const uint32_t GCAttrShift = 4; + static const uint32_t LifetimeMask = 0x1C0; + static const uint32_t LifetimeShift = 6; + static const uint32_t AddressSpaceMask = + ~(CVRMask | UMask | GCAttrMask | LifetimeMask); + static const uint32_t AddressSpaceShift = 9; }; /// A std::pair-like structure for storing a qualified type split diff --git a/clang/include/clang/Basic/AddressSpaces.h b/clang/include/clang/Basic/AddressSpaces.h index 8dd7566..63df61b 100644 --- a/clang/include/clang/Basic/AddressSpaces.h +++ b/clang/include/clang/Basic/AddressSpaces.h @@ -25,7 +25,7 @@ namespace LangAS { /// This uses a high starting offset so as not to conflict with any address /// space used by a target. enum ID { - Offset = 0xFFFF00, + Offset = 0x7FFF00, opencl_global = Offset, opencl_local, diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 1ae2c57..52ab32e 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -2149,10 +2149,6 @@ def InitSeg : Attr { }]; } -def Unaligned : IgnoredAttr { - let Spellings = [Keyword<"__unaligned">]; -} - def LoopHint : Attr { /// #pragma clang loop