Skip to content

Commit

Permalink
Redirect DataLayout from TargetMachine to Module in MachineFunction
Browse files Browse the repository at this point in the history
Summary:
This change is part of a series of commits dedicated to have a
single DataLayout during compilation by using always the one owned by the
module.

Reviewers: echristo

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D10984

From: Mehdi Amini <mehdi.amini@apple.com>
llvm-svn: 241610
  • Loading branch information
joker-eph committed Jul 7, 2015
1 parent af04c2a commit 42e9f96
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 24 deletions.
9 changes: 5 additions & 4 deletions llvm/include/llvm/CodeGen/MachineConstantPool.h
Expand Up @@ -135,17 +135,18 @@ class MachineConstantPoolEntry {
/// address of the function constant pool values.
/// @brief The machine constant pool.
class MachineConstantPool {
const TargetMachine &TM; ///< The target machine.
unsigned PoolAlignment; ///< The alignment for the pool.
std::vector<MachineConstantPoolEntry> Constants; ///< The pool of constants.
/// MachineConstantPoolValues that use an existing MachineConstantPoolEntry.
DenseSet<MachineConstantPoolValue*> MachineCPVsSharingEntries;
const DataLayout &DL;

const DataLayout &getDataLayout() const { return DL; }

const DataLayout *getDataLayout() const;
public:
/// @brief The only constructor.
explicit MachineConstantPool(const TargetMachine &TM)
: TM(TM), PoolAlignment(1) {}
explicit MachineConstantPool(const DataLayout &DL)
: PoolAlignment(1), DL(DL) {}
~MachineConstantPool();

/// getConstantPoolAlignment - Return the alignment required by
Expand Down
3 changes: 3 additions & 0 deletions llvm/include/llvm/CodeGen/MachineFunction.h
Expand Up @@ -155,6 +155,9 @@ class MachineFunction {
MachineModuleInfo &getMMI() const { return MMI; }
MCContext &getContext() const { return Ctx; }

/// Return the DataLayout attached to the Module associated to this MF.
const DataLayout &getDataLayout() const;

/// getFunction - Return the LLVM function that this machine code represents
///
const Function *getFunction() const { return Fn; }
Expand Down
40 changes: 20 additions & 20 deletions llvm/lib/CodeGen/MachineFunction.cpp
Expand Up @@ -29,6 +29,7 @@
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/ModuleSlotTracker.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCContext.h"
Expand Down Expand Up @@ -74,7 +75,7 @@ MachineFunction::MachineFunction(const Function *F, const TargetMachine &TM,
if (Fn->hasFnAttribute(Attribute::StackAlignment))
FrameInfo->ensureMaxAlignment(Fn->getFnStackAlignment());

ConstantPool = new (Allocator) MachineConstantPool(TM);
ConstantPool = new (Allocator) MachineConstantPool(getDataLayout());
Alignment = STI->getTargetLowering()->getMinFunctionAlignment();

// FIXME: Shouldn't use pref alignment if explicit alignment is set on Fn.
Expand Down Expand Up @@ -118,6 +119,10 @@ MachineFunction::~MachineFunction() {
}
}

const DataLayout &MachineFunction::getDataLayout() const {
return Fn->getParent()->getDataLayout();
}

/// Get the JumpTableInfo for this function.
/// If it does not already exist, allocate one.
MachineJumpTableInfo *MachineFunction::
Expand Down Expand Up @@ -458,12 +463,12 @@ unsigned MachineFunction::addLiveIn(unsigned PReg,
/// normal 'L' label is returned.
MCSymbol *MachineFunction::getJTISymbol(unsigned JTI, MCContext &Ctx,
bool isLinkerPrivate) const {
const DataLayout *DL = getTarget().getDataLayout();
const DataLayout &DL = getDataLayout();
assert(JumpTableInfo && "No jump tables");
assert(JTI < JumpTableInfo->getJumpTables().size() && "Invalid JTI!");

const char *Prefix = isLinkerPrivate ? DL->getLinkerPrivateGlobalPrefix() :
DL->getPrivateGlobalPrefix();
const char *Prefix = isLinkerPrivate ? DL.getLinkerPrivateGlobalPrefix()
: DL.getPrivateGlobalPrefix();
SmallString<60> Name;
raw_svector_ostream(Name)
<< Prefix << "JTI" << getFunctionNumber() << '_' << JTI;
Expand All @@ -472,9 +477,9 @@ MCSymbol *MachineFunction::getJTISymbol(unsigned JTI, MCContext &Ctx,

/// Return a function-local symbol to represent the PIC base.
MCSymbol *MachineFunction::getPICBaseSymbol() const {
const DataLayout *DL = getTarget().getDataLayout();
return Ctx.getOrCreateSymbol(Twine(DL->getPrivateGlobalPrefix())+
Twine(getFunctionNumber())+"$pb");
const DataLayout &DL = getDataLayout();
return Ctx.getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
Twine(getFunctionNumber()) + "$pb");
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -790,10 +795,6 @@ void MachineJumpTableInfo::dump() const { print(dbgs()); }

void MachineConstantPoolValue::anchor() { }

const DataLayout *MachineConstantPool::getDataLayout() const {
return TM.getDataLayout();
}

Type *MachineConstantPoolEntry::getType() const {
if (isMachineConstantPoolEntry())
return Val.MachineCPVal->getType();
Expand Down Expand Up @@ -851,7 +852,7 @@ MachineConstantPool::~MachineConstantPool() {
/// Test whether the given two constants can be allocated the same constant pool
/// entry.
static bool CanShareConstantPoolEntry(const Constant *A, const Constant *B,
const DataLayout *TD) {
const DataLayout &DL) {
// Handle the trivial case quickly.
if (A == B) return true;

Expand All @@ -865,8 +866,8 @@ static bool CanShareConstantPoolEntry(const Constant *A, const Constant *B,
return false;

// For now, only support constants with the same size.
uint64_t StoreSize = TD->getTypeStoreSize(A->getType());
if (StoreSize != TD->getTypeStoreSize(B->getType()) || StoreSize > 128)
uint64_t StoreSize = DL.getTypeStoreSize(A->getType());
if (StoreSize != DL.getTypeStoreSize(B->getType()) || StoreSize > 128)
return false;

Type *IntTy = IntegerType::get(A->getContext(), StoreSize*8);
Expand All @@ -877,16 +878,16 @@ static bool CanShareConstantPoolEntry(const Constant *A, const Constant *B,
// DataLayout.
if (isa<PointerType>(A->getType()))
A = ConstantFoldInstOperands(Instruction::PtrToInt, IntTy,
const_cast<Constant *>(A), *TD);
const_cast<Constant *>(A), DL);
else if (A->getType() != IntTy)
A = ConstantFoldInstOperands(Instruction::BitCast, IntTy,
const_cast<Constant *>(A), *TD);
const_cast<Constant *>(A), DL);
if (isa<PointerType>(B->getType()))
B = ConstantFoldInstOperands(Instruction::PtrToInt, IntTy,
const_cast<Constant *>(B), *TD);
const_cast<Constant *>(B), DL);
else if (B->getType() != IntTy)
B = ConstantFoldInstOperands(Instruction::BitCast, IntTy,
const_cast<Constant *>(B), *TD);
const_cast<Constant *>(B), DL);

return A == B;
}
Expand All @@ -903,8 +904,7 @@ unsigned MachineConstantPool::getConstantPoolIndex(const Constant *C,
// FIXME, this could be made much more efficient for large constant pools.
for (unsigned i = 0, e = Constants.size(); i != e; ++i)
if (!Constants[i].isMachineConstantPoolEntry() &&
CanShareConstantPoolEntry(Constants[i].Val.ConstVal, C,
getDataLayout())) {
CanShareConstantPoolEntry(Constants[i].Val.ConstVal, C, DL)) {
if ((unsigned)Constants[i].getAlignment() < Alignment)
Constants[i].Alignment = Alignment;
return i;
Expand Down

0 comments on commit 42e9f96

Please sign in to comment.