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
This commit is contained in:
Benjamin Kramer 2015-04-02 12:25:07 +00:00
parent 165307184a
commit 1d4ffd74c1
6 changed files with 24 additions and 56 deletions

View File

@ -14,6 +14,7 @@
#ifndef LLVM_CLANG_AST_DECLGROUP_H #ifndef LLVM_CLANG_AST_DECLGROUP_H
#define LLVM_CLANG_AST_DECLGROUP_H #define LLVM_CLANG_AST_DECLGROUP_H
#include "llvm/Support/Compiler.h"
#include "llvm/Support/DataTypes.h" #include "llvm/Support/DataTypes.h"
#include <cassert> #include <cassert>
@ -24,13 +25,9 @@ class Decl;
class DeclGroup; class DeclGroup;
class DeclGroupIterator; class DeclGroupIterator;
class DeclGroup { class LLVM_ALIGNAS(sizeof(void *)) DeclGroup {
// FIXME: Include a TypeSpecifier object. // FIXME: Include a TypeSpecifier object.
union { unsigned NumDecls;
unsigned NumDecls;
Decl *Aligner;
};
private: private:
DeclGroup() : NumDecls(0) {} DeclGroup() : NumDecls(0) {}

View File

@ -460,21 +460,12 @@ public:
/// friend void foo<>(T); /// friend void foo<>(T);
/// }; /// };
/// \endcode /// \endcode
class DependentFunctionTemplateSpecializationInfo { class LLVM_ALIGNAS(sizeof(void *)) DependentFunctionTemplateSpecializationInfo {
struct CA { /// The number of potential template candidates.
/// The number of potential template candidates. unsigned NumTemplates;
unsigned NumTemplates;
/// The number of template arguments. /// The number of template arguments.
unsigned NumArgs; 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 locations of the left and right angle brackets. /// The locations of the left and right angle brackets.
SourceRange AngleLocs; SourceRange AngleLocs;
@ -490,9 +481,7 @@ public:
/// \brief Returns the number of function templates that this might /// \brief Returns the number of function templates that this might
/// be a specialization of. /// be a specialization of.
unsigned getNumTemplates() const { unsigned getNumTemplates() const { return NumTemplates; }
return d.NumTemplates;
}
/// \brief Returns the i'th template candidate. /// \brief Returns the i'th template candidate.
FunctionTemplateDecl *getTemplate(unsigned I) const { FunctionTemplateDecl *getTemplate(unsigned I) const {
@ -507,9 +496,7 @@ public:
} }
/// \brief Returns the number of explicit template arguments that were given. /// \brief Returns the number of explicit template arguments that were given.
unsigned getNumTemplateArgs() const { unsigned getNumTemplateArgs() const { return NumArgs; }
return d.NumArgs;
}
/// \brief Returns the nth template argument. /// \brief Returns the nth template argument.
const TemplateArgumentLoc &getTemplateArg(unsigned I) const { const TemplateArgumentLoc &getTemplateArg(unsigned I) const {

View File

@ -101,7 +101,7 @@ namespace clang {
/// Stmt - This represents one statement. /// Stmt - This represents one statement.
/// ///
class Stmt { class LLVM_ALIGNAS(sizeof(void *)) Stmt {
public: public:
enum StmtClass { enum StmtClass {
NoStmtClass = 0, NoStmtClass = 0,
@ -287,9 +287,6 @@ protected:
}; };
union { union {
// FIXME: this is wasteful on 64-bit platforms.
void *Aligner;
StmtBitfields StmtBits; StmtBitfields StmtBits;
CompoundStmtBitfields CompoundStmtBits; CompoundStmtBitfields CompoundStmtBits;
ExprBitfields ExprBits; ExprBitfields ExprBits;
@ -341,13 +338,12 @@ private:
protected: protected:
/// \brief Construct an empty statement. /// \brief Construct an empty statement.
explicit Stmt(StmtClass SC, EmptyShell) { explicit Stmt(StmtClass SC, EmptyShell) : Stmt(SC) {}
StmtBits.sClass = SC;
if (StatisticsEnabled) Stmt::addStmtClass(SC);
}
public: public:
Stmt(StmtClass SC) { Stmt(StmtClass SC) {
static_assert(sizeof(*this) % llvm::AlignOf<void *>::Alignment == 0,
"Insufficient alignment!");
StmtBits.sClass = SC; StmtBits.sClass = SC;
if (StatisticsEnabled) Stmt::addStmtClass(SC); if (StatisticsEnabled) Stmt::addStmtClass(SC);
} }

View File

@ -82,7 +82,7 @@ namespace SrcMgr {
/// \brief One instance of this struct is kept for every file loaded or used. /// \brief One instance of this struct is kept for every file loaded or used.
/// ///
/// This object owns the MemoryBuffer object. /// This object owns the MemoryBuffer object.
class ContentCache { class LLVM_ALIGNAS(8) ContentCache {
enum CCFlags { enum CCFlags {
/// \brief Whether the buffer is invalid. /// \brief Whether the buffer is invalid.
InvalidFlag = 0x01, InvalidFlag = 0x01,
@ -90,15 +90,6 @@ namespace SrcMgr {
DoNotFreeFlag = 0x02 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 /// \brief The actual buffer containing the characters from the input
/// file. /// file.
/// ///
@ -142,14 +133,9 @@ namespace SrcMgr {
/// \brief True if this content cache was initially created for a source /// \brief True if this content cache was initially created for a source
/// file considered as a system one. /// file considered as a system one.
unsigned IsSystemFile : 1; unsigned IsSystemFile : 1;
ContentCache(const FileEntry *Ent = nullptr) ContentCache(const FileEntry *Ent = nullptr) : ContentCache(Ent, Ent) {}
: 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, const FileEntry *contentEnt) ContentCache(const FileEntry *Ent, const FileEntry *contentEnt)
: Buffer(nullptr, false), OrigEntry(Ent), ContentsEntry(contentEnt), : Buffer(nullptr, false), OrigEntry(Ent), ContentsEntry(contentEnt),
SourceLineCache(nullptr), NumLines(0), BufferOverridden(false), SourceLineCache(nullptr), NumLines(0), BufferOverridden(false),

View File

@ -3103,10 +3103,10 @@ FunctionDecl::setDependentTemplateSpecialization(ASTContext &Context,
DependentFunctionTemplateSpecializationInfo:: DependentFunctionTemplateSpecializationInfo::
DependentFunctionTemplateSpecializationInfo(const UnresolvedSetImpl &Ts, DependentFunctionTemplateSpecializationInfo(const UnresolvedSetImpl &Ts,
const TemplateArgumentListInfo &TArgs) const TemplateArgumentListInfo &TArgs)
: AngleLocs(TArgs.getLAngleLoc(), TArgs.getRAngleLoc()) { : NumTemplates(Ts.size()), NumArgs(TArgs.size()),
AngleLocs(TArgs.getLAngleLoc(), TArgs.getRAngleLoc()) {
d.NumTemplates = Ts.size(); static_assert(sizeof(*this) % llvm::AlignOf<void *>::Alignment == 0,
d.NumArgs = TArgs.size(); "Trailing data is unaligned!");
FunctionTemplateDecl **TsArray = FunctionTemplateDecl **TsArray =
const_cast<FunctionTemplateDecl**>(getTemplates()); const_cast<FunctionTemplateDecl**>(getTemplates());

View File

@ -18,6 +18,8 @@
using namespace clang; using namespace clang;
DeclGroup* DeclGroup::Create(ASTContext &C, Decl **Decls, unsigned NumDecls) { DeclGroup* DeclGroup::Create(ASTContext &C, Decl **Decls, unsigned NumDecls) {
static_assert(sizeof(DeclGroup) % llvm::AlignOf<void *>::Alignment == 0,
"Trailing data is unaligned!");
assert(NumDecls > 1 && "Invalid DeclGroup"); assert(NumDecls > 1 && "Invalid DeclGroup");
unsigned Size = sizeof(DeclGroup) + sizeof(Decl*) * NumDecls; unsigned Size = sizeof(DeclGroup) + sizeof(Decl*) * NumDecls;
void* Mem = C.Allocate(Size, llvm::AlignOf<DeclGroup>::Alignment); void* Mem = C.Allocate(Size, llvm::AlignOf<DeclGroup>::Alignment);