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:
parent
165307184a
commit
1d4ffd74c1
|
@ -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) {}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue