mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-17 04:24:00 +00:00
Add an "alignment" field to the MachineFunction object. It makes more sense to
have the alignment be calculated up front, and have the back-ends obey whatever alignment is decided upon. This allows for future work that would allow for precise no-op placement and the like. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74564 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -111,6 +111,9 @@ class MachineFunction : private Annotation {
|
|||||||
// Tracks debug locations.
|
// Tracks debug locations.
|
||||||
DebugLocTracker DebugLocInfo;
|
DebugLocTracker DebugLocInfo;
|
||||||
|
|
||||||
|
// The alignment of the function.
|
||||||
|
unsigned Alignment;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MachineFunction(const Function *Fn, const TargetMachine &TM);
|
MachineFunction(const Function *Fn, const TargetMachine &TM);
|
||||||
~MachineFunction();
|
~MachineFunction();
|
||||||
@ -148,6 +151,14 @@ public:
|
|||||||
MachineConstantPool *getConstantPool() { return ConstantPool; }
|
MachineConstantPool *getConstantPool() { return ConstantPool; }
|
||||||
const MachineConstantPool *getConstantPool() const { return ConstantPool; }
|
const MachineConstantPool *getConstantPool() const { return ConstantPool; }
|
||||||
|
|
||||||
|
/// getAlignment - Return the alignment of the function.
|
||||||
|
///
|
||||||
|
unsigned getAlignment() const { return Alignment; }
|
||||||
|
|
||||||
|
/// setAlignment - Set the alignment of the function.
|
||||||
|
///
|
||||||
|
void setAlignment(unsigned A) { Alignment = A; }
|
||||||
|
|
||||||
/// MachineFunctionInfo - Keep track of various per-function pieces of
|
/// MachineFunctionInfo - Keep track of various per-function pieces of
|
||||||
/// information for backends that would like to do so.
|
/// information for backends that would like to do so.
|
||||||
///
|
///
|
||||||
|
@ -736,6 +736,9 @@ public:
|
|||||||
/// PIC relocation models.
|
/// PIC relocation models.
|
||||||
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
|
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the alignment of this function.
|
||||||
|
virtual unsigned getFunctionAlignment(const Function *) const = 0;
|
||||||
|
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
// TargetLowering Optimization Methods
|
// TargetLowering Optimization Methods
|
||||||
//
|
//
|
||||||
|
@ -14,6 +14,10 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "llvm/DerivedTypes.h"
|
#include "llvm/DerivedTypes.h"
|
||||||
|
#include "llvm/Function.h"
|
||||||
|
#include "llvm/Instructions.h"
|
||||||
|
#include "llvm/ADT/STLExtras.h"
|
||||||
|
#include "llvm/Config/config.h"
|
||||||
#include "llvm/CodeGen/MachineConstantPool.h"
|
#include "llvm/CodeGen/MachineConstantPool.h"
|
||||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||||
@ -22,15 +26,12 @@
|
|||||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||||
#include "llvm/CodeGen/Passes.h"
|
#include "llvm/CodeGen/Passes.h"
|
||||||
#include "llvm/Target/TargetData.h"
|
#include "llvm/Target/TargetData.h"
|
||||||
|
#include "llvm/Target/TargetLowering.h"
|
||||||
#include "llvm/Target/TargetMachine.h"
|
#include "llvm/Target/TargetMachine.h"
|
||||||
#include "llvm/Target/TargetFrameInfo.h"
|
#include "llvm/Target/TargetFrameInfo.h"
|
||||||
#include "llvm/Function.h"
|
|
||||||
#include "llvm/Instructions.h"
|
|
||||||
#include "llvm/Support/Compiler.h"
|
#include "llvm/Support/Compiler.h"
|
||||||
#include "llvm/Support/GraphWriter.h"
|
#include "llvm/Support/GraphWriter.h"
|
||||||
#include "llvm/Support/raw_ostream.h"
|
#include "llvm/Support/raw_ostream.h"
|
||||||
#include "llvm/ADT/STLExtras.h"
|
|
||||||
#include "llvm/Config/config.h"
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
@ -124,6 +125,7 @@ MachineFunction::MachineFunction(const Function *F,
|
|||||||
MachineFrameInfo(*TM.getFrameInfo());
|
MachineFrameInfo(*TM.getFrameInfo());
|
||||||
ConstantPool = new (Allocator.Allocate<MachineConstantPool>())
|
ConstantPool = new (Allocator.Allocate<MachineConstantPool>())
|
||||||
MachineConstantPool(TM.getTargetData());
|
MachineConstantPool(TM.getTargetData());
|
||||||
|
Alignment = TM.getTargetLowering()->getFunctionAlignment(F);
|
||||||
|
|
||||||
// Set up jump table.
|
// Set up jump table.
|
||||||
const TargetData &TD = *TM.getTargetData();
|
const TargetData &TD = *TM.getTargetData();
|
||||||
|
@ -455,6 +455,11 @@ const char *ARMTargetLowering::getTargetNodeName(unsigned Opcode) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the alignment of this function.
|
||||||
|
unsigned ARMTargetLowering::getFunctionAlignment(const Function *F) const {
|
||||||
|
return getTargetMachine().getSubtarget<ARMSubtarget>().isThumb() ? 1 : 2;
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Lowering Code
|
// Lowering Code
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
@ -197,6 +197,9 @@ namespace llvm {
|
|||||||
return Subtarget;
|
return Subtarget;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the alignment of this function.
|
||||||
|
virtual unsigned getFunctionAlignment(const Function *F) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// Subtarget - Keep a pointer to the ARMSubtarget around so that we can
|
/// Subtarget - Keep a pointer to the ARMSubtarget around so that we can
|
||||||
/// make the right decision when generating code for different targets.
|
/// make the right decision when generating code for different targets.
|
||||||
|
@ -235,15 +235,16 @@ bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
printVisibility(CurrentFnName, F->getVisibility());
|
printVisibility(CurrentFnName, F->getVisibility());
|
||||||
|
|
||||||
if (AFI->isThumbFunction()) {
|
if (AFI->isThumbFunction()) {
|
||||||
EmitAlignment(1, F, AFI->getAlign());
|
EmitAlignment(MF.getAlignment(), F, AFI->getAlign());
|
||||||
O << "\t.code\t16\n";
|
O << "\t.code\t16\n";
|
||||||
O << "\t.thumb_func";
|
O << "\t.thumb_func";
|
||||||
if (Subtarget->isTargetDarwin())
|
if (Subtarget->isTargetDarwin())
|
||||||
O << "\t" << CurrentFnName;
|
O << "\t" << CurrentFnName;
|
||||||
O << "\n";
|
O << "\n";
|
||||||
InCPMode = false;
|
InCPMode = false;
|
||||||
} else
|
} else {
|
||||||
EmitAlignment(2, F);
|
EmitAlignment(MF.getAlignment(), F);
|
||||||
|
}
|
||||||
|
|
||||||
O << CurrentFnName << ":\n";
|
O << CurrentFnName << ":\n";
|
||||||
// Emit pre-function debug information.
|
// Emit pre-function debug information.
|
||||||
|
@ -181,6 +181,11 @@ const char *AlphaTargetLowering::getTargetNodeName(unsigned Opcode) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the function alignment.
|
||||||
|
unsigned AlphaTargetLowering::getFunctionAlignment(const Function *F) const {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
static SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) {
|
static SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) {
|
||||||
MVT PtrVT = Op.getValueType();
|
MVT PtrVT = Op.getValueType();
|
||||||
JumpTableSDNode *JT = cast<JumpTableSDNode>(Op);
|
JumpTableSDNode *JT = cast<JumpTableSDNode>(Op);
|
||||||
|
@ -103,6 +103,9 @@ namespace llvm {
|
|||||||
|
|
||||||
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
|
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the function alignment.
|
||||||
|
virtual unsigned getFunctionAlignment(const Function *F) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Helpers for custom lowering.
|
// Helpers for custom lowering.
|
||||||
void LowerVAARG(SDNode *N, SDValue &Chain, SDValue &DataPtr,
|
void LowerVAARG(SDNode *N, SDValue &Chain, SDValue &DataPtr,
|
||||||
|
@ -155,7 +155,7 @@ bool AlphaAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
const Function *F = MF.getFunction();
|
const Function *F = MF.getFunction();
|
||||||
SwitchToSection(TAI->SectionForGlobal(F));
|
SwitchToSection(TAI->SectionForGlobal(F));
|
||||||
|
|
||||||
EmitAlignment(4, F);
|
EmitAlignment(MF.getAlignment(), F);
|
||||||
switch (F->getLinkage()) {
|
switch (F->getLinkage()) {
|
||||||
default: assert(0 && "Unknown linkage type!");
|
default: assert(0 && "Unknown linkage type!");
|
||||||
case Function::InternalLinkage: // Symbols default to internal.
|
case Function::InternalLinkage: // Symbols default to internal.
|
||||||
|
@ -433,7 +433,7 @@ LinuxAsmPrinter::runOnMachineFunction(MachineFunction &MF)
|
|||||||
const Function *F = MF.getFunction();
|
const Function *F = MF.getFunction();
|
||||||
|
|
||||||
SwitchToSection(TAI->SectionForGlobal(F));
|
SwitchToSection(TAI->SectionForGlobal(F));
|
||||||
EmitAlignment(3, F);
|
EmitAlignment(MF.getAlignment(), F);
|
||||||
|
|
||||||
switch (F->getLinkage()) {
|
switch (F->getLinkage()) {
|
||||||
default: assert(0 && "Unknown linkage type!");
|
default: assert(0 && "Unknown linkage type!");
|
||||||
|
@ -481,6 +481,11 @@ SPUTargetLowering::getTargetNodeName(unsigned Opcode) const
|
|||||||
return ((i != node_names.end()) ? i->second : 0);
|
return ((i != node_names.end()) ? i->second : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the function alignment.
|
||||||
|
unsigned SPUTargetLowering::getFunctionAlignment(const Function *) const {
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Return the Cell SPU's SETCC result type
|
// Return the Cell SPU's SETCC result type
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
@ -148,6 +148,9 @@ namespace llvm {
|
|||||||
virtual bool isLegalAddressImmediate(GlobalValue *) const;
|
virtual bool isLegalAddressImmediate(GlobalValue *) const;
|
||||||
|
|
||||||
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
|
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the function alignment.
|
||||||
|
virtual unsigned getFunctionAlignment(const Function *F) const;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,7 +137,7 @@ bool IA64AsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
SwitchToSection(TAI->SectionForGlobal(F));
|
SwitchToSection(TAI->SectionForGlobal(F));
|
||||||
|
|
||||||
// Print out labels for the function.
|
// Print out labels for the function.
|
||||||
EmitAlignment(5);
|
EmitAlignment(MF.getAlignment());
|
||||||
O << "\t.global\t" << CurrentFnName << '\n';
|
O << "\t.global\t" << CurrentFnName << '\n';
|
||||||
|
|
||||||
printVisibility(CurrentFnName, F->getVisibility());
|
printVisibility(CurrentFnName, F->getVisibility());
|
||||||
|
@ -148,6 +148,11 @@ MVT IA64TargetLowering::getSetCCResultType(MVT VT) const {
|
|||||||
return MVT::i1;
|
return MVT::i1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the function alignment.
|
||||||
|
unsigned IA64TargetLowering::getFunctionAlignment(const Function *) const {
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
|
||||||
void IA64TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG,
|
void IA64TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG,
|
||||||
SmallVectorImpl<SDValue> &ArgValues,
|
SmallVectorImpl<SDValue> &ArgValues,
|
||||||
DebugLoc dl) {
|
DebugLoc dl) {
|
||||||
|
@ -70,6 +70,8 @@ namespace llvm {
|
|||||||
/// (currently, only "ret void")
|
/// (currently, only "ret void")
|
||||||
virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG);
|
virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG);
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the function alignment.
|
||||||
|
virtual unsigned getFunctionAlignment(const Function *F) const;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,10 +97,7 @@ void MSP430AsmPrinter::emitFunctionHeader(const MachineFunction &MF) {
|
|||||||
|
|
||||||
SwitchToSection(TAI->SectionForGlobal(F));
|
SwitchToSection(TAI->SectionForGlobal(F));
|
||||||
|
|
||||||
unsigned FnAlign = 4;
|
unsigned FnAlign = MF.getAlignment();
|
||||||
if (F->hasFnAttr(Attribute::OptimizeForSize))
|
|
||||||
FnAlign = 1;
|
|
||||||
|
|
||||||
EmitAlignment(FnAlign, F);
|
EmitAlignment(FnAlign, F);
|
||||||
|
|
||||||
switch (F->getLinkage()) {
|
switch (F->getLinkage()) {
|
||||||
|
@ -127,6 +127,11 @@ SDValue MSP430TargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the alignment of this function.
|
||||||
|
unsigned MSP430TargetLowering::getFunctionAlignment(const Function *F) const {
|
||||||
|
return F->hasFnAttr(Attribute::OptimizeForSize) ? 1 : 4;
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Calling Convention Implementation
|
// Calling Convention Implementation
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
@ -74,6 +74,9 @@ namespace llvm {
|
|||||||
/// DAG node.
|
/// DAG node.
|
||||||
virtual const char *getTargetNodeName(unsigned Opcode) const;
|
virtual const char *getTargetNodeName(unsigned Opcode) const;
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the alignment of this function.
|
||||||
|
virtual unsigned getFunctionAlignment(const Function *F) const;
|
||||||
|
|
||||||
SDValue LowerFORMAL_ARGUMENTS(SDValue Op, SelectionDAG &DAG);
|
SDValue LowerFORMAL_ARGUMENTS(SDValue Op, SelectionDAG &DAG);
|
||||||
SDValue LowerCALL(SDValue Op, SelectionDAG &DAG);
|
SDValue LowerCALL(SDValue Op, SelectionDAG &DAG);
|
||||||
SDValue LowerRET(SDValue Op, SelectionDAG &DAG);
|
SDValue LowerRET(SDValue Op, SelectionDAG &DAG);
|
||||||
|
@ -230,7 +230,7 @@ emitFunctionStart(MachineFunction &MF)
|
|||||||
SwitchToSection(TAI->SectionForGlobal(F));
|
SwitchToSection(TAI->SectionForGlobal(F));
|
||||||
|
|
||||||
// 2 bits aligned
|
// 2 bits aligned
|
||||||
EmitAlignment(2, F);
|
EmitAlignment(MF.getAlignment(), F);
|
||||||
|
|
||||||
O << "\t.globl\t" << CurrentFnName << '\n';
|
O << "\t.globl\t" << CurrentFnName << '\n';
|
||||||
O << "\t.ent\t" << CurrentFnName << '\n';
|
O << "\t.ent\t" << CurrentFnName << '\n';
|
||||||
|
@ -154,11 +154,14 @@ MipsTargetLowering(MipsTargetMachine &TM): TargetLowering(TM)
|
|||||||
computeRegisterProperties();
|
computeRegisterProperties();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
MVT MipsTargetLowering::getSetCCResultType(MVT VT) const {
|
MVT MipsTargetLowering::getSetCCResultType(MVT VT) const {
|
||||||
return MVT::i32;
|
return MVT::i32;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the function alignment.
|
||||||
|
unsigned MipsTargetLowering::getFunctionAlignment(const Function *) const {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
SDValue MipsTargetLowering::
|
SDValue MipsTargetLowering::
|
||||||
LowerOperation(SDValue Op, SelectionDAG &DAG)
|
LowerOperation(SDValue Op, SelectionDAG &DAG)
|
||||||
|
@ -84,6 +84,8 @@ namespace llvm {
|
|||||||
/// getSetCCResultType - get the ISD::SETCC result ValueType
|
/// getSetCCResultType - get the ISD::SETCC result ValueType
|
||||||
MVT getSetCCResultType(MVT VT) const;
|
MVT getSetCCResultType(MVT VT) const;
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the function alignment.
|
||||||
|
virtual unsigned getFunctionAlignment(const Function *F) const;
|
||||||
private:
|
private:
|
||||||
// Subtarget Info
|
// Subtarget Info
|
||||||
const MipsSubtarget *Subtarget;
|
const MipsSubtarget *Subtarget;
|
||||||
|
@ -145,6 +145,11 @@ namespace llvm {
|
|||||||
unsigned GetTmpSize() { return TmpSize; }
|
unsigned GetTmpSize() { return TmpSize; }
|
||||||
void SetTmpSize(unsigned Size) { TmpSize = Size; }
|
void SetTmpSize(unsigned Size) { TmpSize = Size; }
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the function alignment.
|
||||||
|
virtual unsigned getFunctionAlignment(const Function *) const {
|
||||||
|
// FIXME: The function never seems to be aligned.
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
private:
|
private:
|
||||||
// If the Node is a BUILD_PAIR representing a direct Address,
|
// If the Node is a BUILD_PAIR representing a direct Address,
|
||||||
// then this function will return true.
|
// then this function will return true.
|
||||||
|
@ -596,7 +596,7 @@ bool PPCLinuxAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
|
|
||||||
printVisibility(CurrentFnName, F->getVisibility());
|
printVisibility(CurrentFnName, F->getVisibility());
|
||||||
|
|
||||||
EmitAlignment(2, F);
|
EmitAlignment(MF.getAlignment(), F);
|
||||||
O << CurrentFnName << ":\n";
|
O << CurrentFnName << ":\n";
|
||||||
|
|
||||||
// Emit pre-function debug information.
|
// Emit pre-function debug information.
|
||||||
@ -773,7 +773,7 @@ bool PPCDarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
|
|
||||||
printVisibility(CurrentFnName, F->getVisibility());
|
printVisibility(CurrentFnName, F->getVisibility());
|
||||||
|
|
||||||
EmitAlignment(F->hasFnAttr(Attribute::OptimizeForSize) ? 2 : 4, F);
|
EmitAlignment(MF.getAlignment(), F);
|
||||||
O << CurrentFnName << ":\n";
|
O << CurrentFnName << ":\n";
|
||||||
|
|
||||||
// Emit pre-function debug information.
|
// Emit pre-function debug information.
|
||||||
|
@ -428,11 +428,17 @@ const char *PPCTargetLowering::getTargetNodeName(unsigned Opcode) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
MVT PPCTargetLowering::getSetCCResultType(MVT VT) const {
|
MVT PPCTargetLowering::getSetCCResultType(MVT VT) const {
|
||||||
return MVT::i32;
|
return MVT::i32;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the function alignment.
|
||||||
|
unsigned PPCTargetLowering::getFunctionAlignment(const Function *F) const {
|
||||||
|
if (getTargetMachine().getSubtarget<PPCSubtarget>().isDarwin())
|
||||||
|
return F->hasFnAttr(Attribute::OptimizeForSize) ? 2 : 4;
|
||||||
|
else
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Node matching predicates, for use by the tblgen matching code.
|
// Node matching predicates, for use by the tblgen matching code.
|
||||||
|
@ -337,6 +337,9 @@ namespace llvm {
|
|||||||
|
|
||||||
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
|
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the function alignment.
|
||||||
|
virtual unsigned getFunctionAlignment(const Function *F) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SDValue getFramePointerFrameIndex(SelectionDAG & DAG) const;
|
SDValue getFramePointerFrameIndex(SelectionDAG & DAG) const;
|
||||||
SDValue getReturnAddrFrameIndex(SelectionDAG & DAG) const;
|
SDValue getReturnAddrFrameIndex(SelectionDAG & DAG) const;
|
||||||
|
@ -109,7 +109,7 @@ bool SparcAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
// Print out the label for the function.
|
// Print out the label for the function.
|
||||||
const Function *F = MF.getFunction();
|
const Function *F = MF.getFunction();
|
||||||
SwitchToSection(TAI->SectionForGlobal(F));
|
SwitchToSection(TAI->SectionForGlobal(F));
|
||||||
EmitAlignment(4, F);
|
EmitAlignment(MF.getAlignment(), F);
|
||||||
O << "\t.globl\t" << CurrentFnName << '\n';
|
O << "\t.globl\t" << CurrentFnName << '\n';
|
||||||
|
|
||||||
printVisibility(CurrentFnName, F->getVisibility());
|
printVisibility(CurrentFnName, F->getVisibility());
|
||||||
|
@ -1047,3 +1047,8 @@ SparcTargetLowering::isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const {
|
|||||||
// The Sparc target isn't yet aware of offsets.
|
// The Sparc target isn't yet aware of offsets.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the function alignment.
|
||||||
|
unsigned SparcTargetLowering::getFunctionAlignment(const Function *) const {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
@ -73,6 +73,9 @@ namespace llvm {
|
|||||||
MVT VT) const;
|
MVT VT) const;
|
||||||
|
|
||||||
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
|
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the function alignment.
|
||||||
|
virtual unsigned getFunctionAlignment(const Function *F) const;
|
||||||
};
|
};
|
||||||
} // end namespace llvm
|
} // end namespace llvm
|
||||||
|
|
||||||
|
@ -154,21 +154,13 @@ void X86ATTAsmPrinter::decorateName(std::string &Name,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void X86ATTAsmPrinter::emitFunctionHeader(const MachineFunction &MF) {
|
void X86ATTAsmPrinter::emitFunctionHeader(const MachineFunction &MF) {
|
||||||
|
unsigned FnAlign = MF.getAlignment();
|
||||||
const Function *F = MF.getFunction();
|
const Function *F = MF.getFunction();
|
||||||
|
|
||||||
decorateName(CurrentFnName, F);
|
decorateName(CurrentFnName, F);
|
||||||
|
|
||||||
SwitchToSection(TAI->SectionForGlobal(F));
|
SwitchToSection(TAI->SectionForGlobal(F));
|
||||||
|
|
||||||
// FIXME: A function's alignment should be part of MachineFunction. There
|
|
||||||
// shouldn't be a policy decision here.
|
|
||||||
unsigned FnAlign = 4;
|
|
||||||
if (F->hasFnAttr(Attribute::OptimizeForSize))
|
|
||||||
FnAlign = 1;
|
|
||||||
|
|
||||||
switch (F->getLinkage()) {
|
switch (F->getLinkage()) {
|
||||||
default: assert(0 && "Unknown linkage type!");
|
default: assert(0 && "Unknown linkage type!");
|
||||||
case Function::InternalLinkage: // Symbols default to internal.
|
case Function::InternalLinkage: // Symbols default to internal.
|
||||||
|
@ -132,6 +132,7 @@ bool X86IntelAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
// Print out labels for the function.
|
// Print out labels for the function.
|
||||||
const Function *F = MF.getFunction();
|
const Function *F = MF.getFunction();
|
||||||
unsigned CC = F->getCallingConv();
|
unsigned CC = F->getCallingConv();
|
||||||
|
unsigned FnAlign = MF.getAlignment();
|
||||||
|
|
||||||
// Populate function information map. Actually, We don't want to populate
|
// Populate function information map. Actually, We don't want to populate
|
||||||
// non-stdcall or non-fastcall functions' information right now.
|
// non-stdcall or non-fastcall functions' information right now.
|
||||||
@ -141,10 +142,6 @@ bool X86IntelAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
decorateName(CurrentFnName, F);
|
decorateName(CurrentFnName, F);
|
||||||
|
|
||||||
SwitchToTextSection("_text", F);
|
SwitchToTextSection("_text", F);
|
||||||
|
|
||||||
unsigned FnAlign = 4;
|
|
||||||
if (F->hasFnAttr(Attribute::OptimizeForSize))
|
|
||||||
FnAlign = 1;
|
|
||||||
switch (F->getLinkage()) {
|
switch (F->getLinkage()) {
|
||||||
default: assert(0 && "Unsupported linkage type!");
|
default: assert(0 && "Unsupported linkage type!");
|
||||||
case Function::PrivateLinkage:
|
case Function::PrivateLinkage:
|
||||||
|
@ -1027,6 +1027,11 @@ SDValue X86TargetLowering::getPICJumpTableRelocBase(SDValue Table,
|
|||||||
return Table;
|
return Table;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the alignment of this function.
|
||||||
|
unsigned X86TargetLowering::getFunctionAlignment(const Function *F) const {
|
||||||
|
return F->hasFnAttr(Attribute::OptimizeForSize) ? 1 : 4;
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Return Value Calling Convention Implementation
|
// Return Value Calling Convention Implementation
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
@ -534,6 +534,9 @@ namespace llvm {
|
|||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the alignment of this function.
|
||||||
|
virtual unsigned getFunctionAlignment(const Function *F) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// Subtarget - Keep a pointer to the X86Subtarget around so that we can
|
/// Subtarget - Keep a pointer to the X86Subtarget around so that we can
|
||||||
/// make the right decision when generating code for different targets.
|
/// make the right decision when generating code for different targets.
|
||||||
|
@ -277,7 +277,7 @@ emitFunctionStart(MachineFunction &MF)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// (1 << 1) byte aligned
|
// (1 << 1) byte aligned
|
||||||
EmitAlignment(1, F, 1);
|
EmitAlignment(MF.getAlignment(), F, 1);
|
||||||
if (TAI->hasDotTypeDotSizeDirective()) {
|
if (TAI->hasDotTypeDotSizeDirective()) {
|
||||||
O << "\t.type " << CurrentFnName << ",@function\n";
|
O << "\t.type " << CurrentFnName << ",@function\n";
|
||||||
}
|
}
|
||||||
|
@ -187,6 +187,12 @@ void XCoreTargetLowering::ReplaceNodeResults(SDNode *N,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the alignment of this function.
|
||||||
|
unsigned XCoreTargetLowering::
|
||||||
|
getFunctionAlignment(const Function *) const {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Misc Lower Operation implementation
|
// Misc Lower Operation implementation
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
@ -84,6 +84,9 @@ namespace llvm {
|
|||||||
virtual bool isLegalAddressingMode(const AddrMode &AM,
|
virtual bool isLegalAddressingMode(const AddrMode &AM,
|
||||||
const Type *Ty) const;
|
const Type *Ty) const;
|
||||||
|
|
||||||
|
/// getFunctionAlignment - Return the alignment of this function.
|
||||||
|
virtual unsigned getFunctionAlignment(const Function *F) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const XCoreTargetMachine &TM;
|
const XCoreTargetMachine &TM;
|
||||||
const XCoreSubtarget &Subtarget;
|
const XCoreSubtarget &Subtarget;
|
||||||
|
Reference in New Issue
Block a user