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
#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) {}

View File

@ -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 {

View File

@ -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);
}

View File

@ -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),

View File

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

View File

@ -18,6 +18,8 @@
using namespace clang;
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");
unsigned Size = sizeof(DeclGroup) + sizeof(Decl*) * NumDecls;
void* Mem = C.Allocate(Size, llvm::AlignOf<DeclGroup>::Alignment);