diff options
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCBranchSelector.cpp | 17 |
2 files changed, 18 insertions, 2 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp index e5c93950604..5e742cf4e6f 100644 --- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -1199,6 +1199,9 @@ void PPCLinuxAsmPrinter::EmitFunctionBodyStart() { if (Subtarget->isELFv2ABI() // Only do all that if the function uses r2 in the first place. && !MF->getRegInfo().use_empty(PPC::X2)) { + // Note: The logic here must be synchronized with the code in the + // branch-selection pass which sets the offset of the first block in the + // function. This matters because it affects the alignment. const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>(); MCSymbol *GlobalEntryLabel = PPCFI->getGlobalEPSymbol(); diff --git a/llvm/lib/Target/PowerPC/PPCBranchSelector.cpp b/llvm/lib/Target/PowerPC/PPCBranchSelector.cpp index 6bcb062aad8..ae76386fdfb 100644 --- a/llvm/lib/Target/PowerPC/PPCBranchSelector.cpp +++ b/llvm/lib/Target/PowerPC/PPCBranchSelector.cpp @@ -19,8 +19,10 @@ #include "MCTargetDesc/PPCPredicates.h" #include "PPCInstrBuilder.h" #include "PPCInstrInfo.h" +#include "PPCSubtarget.h" #include "llvm/ADT/Statistic.h" #include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/Support/MathExtras.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetSubtargetInfo.h" @@ -92,8 +94,19 @@ bool PPCBSel::runOnMachineFunction(MachineFunction &Fn) { return AlignAmt + OffsetToAlignment(Offset, AlignAmt); }; + // We need to be careful about the offset of the first block in the function + // because it might not have the function's alignment. This happens because, + // under the ELFv2 ABI, for functions which require a TOC pointer, we add a + // two-instruction sequence to the start of the function. + // Note: This needs to be synchronized with the check in + // PPCLinuxAsmPrinter::EmitFunctionBodyStart. + unsigned InitialOffset = 0; + if (Fn.getSubtarget<PPCSubtarget>().isELFv2ABI() && + !Fn.getRegInfo().use_empty(PPC::X2)) + InitialOffset = 8; + // Measure each MBB and compute a size for the entire function. - unsigned FuncSize = 0; + unsigned FuncSize = InitialOffset; for (MachineFunction::iterator MFI = Fn.begin(), E = Fn.end(); MFI != E; ++MFI) { MachineBasicBlock *MBB = &*MFI; @@ -240,7 +253,7 @@ bool PPCBSel::runOnMachineFunction(MachineFunction &Fn) { if (MadeChange) { // If we're going to iterate again, make sure we've updated our // padding-based contributions to the block sizes. - unsigned Offset = 0; + unsigned Offset = InitialOffset; for (MachineFunction::iterator MFI = Fn.begin(), E = Fn.end(); MFI != E; ++MFI) { MachineBasicBlock *MBB = &*MFI; |