forked from OSchip/llvm-project
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
|
||||
#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) {}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue