mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-05 02:07:16 +00:00
[LLVM][Alignment] Introduce Alignment In GlobalObject
Summary: This is patch is part of a serie to introduce an Alignment type. See this thread for context: http://lists.llvm.org/pipermail/llvm-dev/2019-July/133851.html See this patch for the introduction of the type: https://reviews.llvm.org/D64790 Reviewers: jfb Subscribers: hiraditya, dexonsmith, llvm-commits, courbet Tags: #llvm Differential Revision: https://reviews.llvm.org/D65748 Address comments git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@368000 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f5f4196fbf
commit
0557373d00
@ -17,6 +17,7 @@
|
|||||||
#include "llvm/ADT/StringRef.h"
|
#include "llvm/ADT/StringRef.h"
|
||||||
#include "llvm/IR/GlobalValue.h"
|
#include "llvm/IR/GlobalValue.h"
|
||||||
#include "llvm/IR/Value.h"
|
#include "llvm/IR/Value.h"
|
||||||
|
#include "llvm/Support/Alignment.h"
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
@ -58,9 +59,13 @@ public:
|
|||||||
unsigned getAlignment() const {
|
unsigned getAlignment() const {
|
||||||
unsigned Data = getGlobalValueSubClassData();
|
unsigned Data = getGlobalValueSubClassData();
|
||||||
unsigned AlignmentData = Data & AlignmentMask;
|
unsigned AlignmentData = Data & AlignmentMask;
|
||||||
return (1u << AlignmentData) >> 1;
|
MaybeAlign Align = decodeMaybeAlign(AlignmentData);
|
||||||
|
return Align ? Align->value() : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// FIXME: Remove this setter once the migration to MaybeAlign is over.
|
||||||
void setAlignment(unsigned Align);
|
void setAlignment(unsigned Align);
|
||||||
|
void setAlignment(MaybeAlign Align);
|
||||||
|
|
||||||
unsigned getGlobalObjectSubClassData() const {
|
unsigned getGlobalObjectSubClassData() const {
|
||||||
unsigned ValueData = getGlobalValueSubClassData();
|
unsigned ValueData = getGlobalValueSubClassData();
|
||||||
|
@ -101,7 +101,7 @@ public:
|
|||||||
|
|
||||||
explicit MaybeAlign(uint64_t Value) {
|
explicit MaybeAlign(uint64_t Value) {
|
||||||
assert((Value == 0 || llvm::isPowerOf2_64(Value)) &&
|
assert((Value == 0 || llvm::isPowerOf2_64(Value)) &&
|
||||||
"Alignment is not 0 or a power of 2");
|
"Alignment is neither 0 nor a power of 2");
|
||||||
if (Value)
|
if (Value)
|
||||||
emplace(Value);
|
emplace(Value);
|
||||||
}
|
}
|
||||||
|
@ -114,13 +114,17 @@ unsigned GlobalValue::getAddressSpace() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GlobalObject::setAlignment(unsigned Align) {
|
void GlobalObject::setAlignment(unsigned Align) {
|
||||||
assert((Align & (Align-1)) == 0 && "Alignment is not a power of 2!");
|
setAlignment(MaybeAlign(Align));
|
||||||
assert(Align <= MaximumAlignment &&
|
}
|
||||||
"Alignment is greater than MaximumAlignment!");
|
|
||||||
unsigned AlignmentData = Log2_32(Align) + 1;
|
void GlobalObject::setAlignment(MaybeAlign Align) {
|
||||||
|
assert(!Align || Align <= MaximumAlignment &&
|
||||||
|
"Alignment is greater than MaximumAlignment!");
|
||||||
|
unsigned AlignmentData = encode(Align);
|
||||||
unsigned OldData = getGlobalValueSubClassData();
|
unsigned OldData = getGlobalValueSubClassData();
|
||||||
setGlobalValueSubClassData((OldData & ~AlignmentMask) | AlignmentData);
|
setGlobalValueSubClassData((OldData & ~AlignmentMask) | AlignmentData);
|
||||||
assert(getAlignment() == Align && "Alignment representation error!");
|
assert(MaybeAlign(getAlignment()) == Align &&
|
||||||
|
"Alignment representation error!");
|
||||||
}
|
}
|
||||||
|
|
||||||
void GlobalObject::copyAttributesFrom(const GlobalObject *Src) {
|
void GlobalObject::copyAttributesFrom(const GlobalObject *Src) {
|
||||||
|
@ -99,7 +99,8 @@ TEST(GlobalTest, AlignDeath) {
|
|||||||
Constant::getAllOnesValue(Int32Ty), "var", nullptr,
|
Constant::getAllOnesValue(Int32Ty), "var", nullptr,
|
||||||
GlobalVariable::NotThreadLocal, 1);
|
GlobalVariable::NotThreadLocal, 1);
|
||||||
|
|
||||||
EXPECT_DEATH(Var->setAlignment(536870913U), "Alignment is not a power of 2");
|
EXPECT_DEATH(Var->setAlignment(536870913U),
|
||||||
|
"Alignment is neither 0 nor a power of 2");
|
||||||
EXPECT_DEATH(Var->setAlignment(1073741824U),
|
EXPECT_DEATH(Var->setAlignment(1073741824U),
|
||||||
"Alignment is greater than MaximumAlignment");
|
"Alignment is greater than MaximumAlignment");
|
||||||
}
|
}
|
||||||
|
@ -256,7 +256,8 @@ TEST(AlignmentDeathTest, InvalidCTors) {
|
|||||||
EXPECT_DEATH((Align(0)), "Value must not be 0");
|
EXPECT_DEATH((Align(0)), "Value must not be 0");
|
||||||
for (uint64_t Value : getNonPowerOfTwo()) {
|
for (uint64_t Value : getNonPowerOfTwo()) {
|
||||||
EXPECT_DEATH((Align(Value)), "Alignment is not a power of 2");
|
EXPECT_DEATH((Align(Value)), "Alignment is not a power of 2");
|
||||||
EXPECT_DEATH((MaybeAlign(Value)), "Alignment is not 0 or a power of 2");
|
EXPECT_DEATH((MaybeAlign(Value)),
|
||||||
|
"Alignment is neither 0 nor a power of 2");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user