diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2015-04-02 12:25:07 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2015-04-02 12:25:07 +0000 |
commit | 1d4ffd74c167467b7659d560d3f7b150fd931fbb (patch) | |
tree | 19dc6d2c7fc7d4ccf3c9e96118341048ff332899 /clang/include | |
parent | 165307184a54624f4a30936d5edd0c9faa63357c (diff) | |
download | bcm5719-llvm-1d4ffd74c167467b7659d560d3f7b150fd931fbb.tar.gz bcm5719-llvm-1d4ffd74c167467b7659d560d3f7b150fd931fbb.zip |
Replace custom alignment enforcement with LLVM_ALIGNAS.
This isn't perfect as it still assumes sizeof(void*) == alignof(void*),
but we can fix that when compiler support gets better.
Shrinks some Stmts that happen to inherit from Stmt and have a
SourceLocation as the first member (64 bit archs only).
llvm-svn: 233911
Diffstat (limited to 'clang/include')
-rw-r--r-- | clang/include/clang/AST/DeclGroup.h | 9 | ||||
-rw-r--r-- | clang/include/clang/AST/DeclTemplate.h | 27 | ||||
-rw-r--r-- | clang/include/clang/AST/Stmt.h | 12 | ||||
-rw-r--r-- | clang/include/clang/Basic/SourceManager.h | 22 |
4 files changed, 18 insertions, 52 deletions
diff --git a/clang/include/clang/AST/DeclGroup.h b/clang/include/clang/AST/DeclGroup.h index bd3dbd8fa78..04718f4741b 100644 --- a/clang/include/clang/AST/DeclGroup.h +++ b/clang/include/clang/AST/DeclGroup.h @@ -14,6 +14,7 @@ #ifndef LLVM_CLANG_AST_DECLGROUP_H #define LLVM_CLANG_AST_DECLGROUP_H +#include "llvm/Support/Compiler.h" #include "llvm/Support/DataTypes.h" #include <cassert> @@ -24,13 +25,9 @@ class Decl; class DeclGroup; class DeclGroupIterator; -class DeclGroup { +class LLVM_ALIGNAS(sizeof(void *)) DeclGroup { // FIXME: Include a TypeSpecifier object. - union { - unsigned NumDecls; - - Decl *Aligner; - }; + unsigned NumDecls; private: DeclGroup() : NumDecls(0) {} diff --git a/clang/include/clang/AST/DeclTemplate.h b/clang/include/clang/AST/DeclTemplate.h index 39b5208a662..60e0481944c 100644 --- a/clang/include/clang/AST/DeclTemplate.h +++ b/clang/include/clang/AST/DeclTemplate.h @@ -460,21 +460,12 @@ public: /// friend void foo<>(T); /// }; /// \endcode -class DependentFunctionTemplateSpecializationInfo { - struct CA { - /// The number of potential template candidates. - unsigned NumTemplates; +class LLVM_ALIGNAS(sizeof(void *)) DependentFunctionTemplateSpecializationInfo { + /// The number of potential template candidates. + unsigned NumTemplates; - /// The number of template arguments. - unsigned NumArgs; - }; - - union { - // Force sizeof to be a multiple of sizeof(void*) so that the - // trailing data is aligned. - void *Aligner; - struct CA d; - }; + /// The number of template arguments. + unsigned NumArgs; /// The locations of the left and right angle brackets. SourceRange AngleLocs; @@ -490,9 +481,7 @@ public: /// \brief Returns the number of function templates that this might /// be a specialization of. - unsigned getNumTemplates() const { - return d.NumTemplates; - } + unsigned getNumTemplates() const { return NumTemplates; } /// \brief Returns the i'th template candidate. FunctionTemplateDecl *getTemplate(unsigned I) const { @@ -507,9 +496,7 @@ public: } /// \brief Returns the number of explicit template arguments that were given. - unsigned getNumTemplateArgs() const { - return d.NumArgs; - } + unsigned getNumTemplateArgs() const { return NumArgs; } /// \brief Returns the nth template argument. const TemplateArgumentLoc &getTemplateArg(unsigned I) const { diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index 33f4aa0dcd2..6739cb3fb00 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -101,7 +101,7 @@ namespace clang { /// Stmt - This represents one statement. /// -class Stmt { +class LLVM_ALIGNAS(sizeof(void *)) Stmt { public: enum StmtClass { NoStmtClass = 0, @@ -287,9 +287,6 @@ protected: }; union { - // FIXME: this is wasteful on 64-bit platforms. - void *Aligner; - StmtBitfields StmtBits; CompoundStmtBitfields CompoundStmtBits; ExprBitfields ExprBits; @@ -341,13 +338,12 @@ private: protected: /// \brief Construct an empty statement. - explicit Stmt(StmtClass SC, EmptyShell) { - StmtBits.sClass = SC; - if (StatisticsEnabled) Stmt::addStmtClass(SC); - } + explicit Stmt(StmtClass SC, EmptyShell) : Stmt(SC) {} public: Stmt(StmtClass SC) { + static_assert(sizeof(*this) % llvm::AlignOf<void *>::Alignment == 0, + "Insufficient alignment!"); StmtBits.sClass = SC; if (StatisticsEnabled) Stmt::addStmtClass(SC); } diff --git a/clang/include/clang/Basic/SourceManager.h b/clang/include/clang/Basic/SourceManager.h index 4fa95c59a1d..3aea5ea9825 100644 --- a/clang/include/clang/Basic/SourceManager.h +++ b/clang/include/clang/Basic/SourceManager.h @@ -82,7 +82,7 @@ namespace SrcMgr { /// \brief One instance of this struct is kept for every file loaded or used. /// /// This object owns the MemoryBuffer object. - class ContentCache { + class LLVM_ALIGNAS(8) ContentCache { enum CCFlags { /// \brief Whether the buffer is invalid. InvalidFlag = 0x01, @@ -90,15 +90,6 @@ namespace SrcMgr { DoNotFreeFlag = 0x02 }; - // Note that the first member of this class is an aligned character buffer - // to ensure that this class has an alignment of 8 bytes. This wastes - // 8 bytes for every ContentCache object, but each of these corresponds to - // a file loaded into memory, so the 8 bytes doesn't seem terribly - // important. It is quite awkward to fit this aligner into any other part - // of the class due to the lack of portable ways to combine it with other - // members. - llvm::AlignedCharArray<8, 1> NonceAligner; - /// \brief The actual buffer containing the characters from the input /// file. /// @@ -142,14 +133,9 @@ namespace SrcMgr { /// \brief True if this content cache was initially created for a source /// file considered as a system one. unsigned IsSystemFile : 1; - - ContentCache(const FileEntry *Ent = nullptr) - : Buffer(nullptr, false), OrigEntry(Ent), ContentsEntry(Ent), - SourceLineCache(nullptr), NumLines(0), BufferOverridden(false), - IsSystemFile(false) { - (void)NonceAligner; // Silence warnings about unused member. - } - + + ContentCache(const FileEntry *Ent = nullptr) : ContentCache(Ent, Ent) {} + ContentCache(const FileEntry *Ent, const FileEntry *contentEnt) : Buffer(nullptr, false), OrigEntry(Ent), ContentsEntry(contentEnt), SourceLineCache(nullptr), NumLines(0), BufferOverridden(false), |