on darwin empty functions need to codegen into something of non-zero length,

otherwise labels get incorrectly merged.  We handled this by emitting a 
".byte 0", but this isn't correct on thumb/arm targets where the text segment
needs to be a multiple of 2/4 bytes.  Handle this by emitting a noop.  This
is more gross than it should be because arm/ppc are not fully mc'ized yet.

This fixes rdar://7908505

llvm-svn: 102400
This commit is contained in:
Chris Lattner 2010-04-26 23:37:21 +00:00
parent 5aba2a8293
commit 9292bad5f5
6 changed files with 28 additions and 5 deletions

View File

@ -24,6 +24,7 @@ class LiveVariables;
class MCAsmInfo;
class MachineMemOperand;
class MDNode;
class MCInst;
class SDNode;
class SelectionDAG;
class TargetRegisterClass;
@ -490,6 +491,13 @@ public:
virtual void insertNoop(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MI) const;
/// getNoopForMachoTarget - Return the noop instruction to use for a noop.
virtual void getNoopForMachoTarget(MCInst &NopInst) const {
// Default to just using 'nop' string.
}
/// isPredicated - Returns true if the instruction is already predicated.
///
virtual bool isPredicated(const MachineInstr *MI) const {

View File

@ -585,9 +585,15 @@ void AsmPrinter::EmitFunctionBody() {
// If the function is empty and the object file uses .subsections_via_symbols,
// then we need to emit *something* to the function body to prevent the
// labels from collapsing together. Just emit a 0 byte.
if (MAI->hasSubsectionsViaSymbols() && !HasAnyRealCode)
OutStreamer.EmitIntValue(0, 1, 0/*addrspace*/);
// labels from collapsing together. Just emit a noop.
if (MAI->hasSubsectionsViaSymbols() && !HasAnyRealCode) {
MCInst Noop;
TM.getInstrInfo()->getNoopForMachoTarget(Noop);
if (Noop.getOpcode())
OutStreamer.EmitInstruction(Noop);
else // Target not mc-ized yet.
OutStreamer.EmitRawText(StringRef("\tnop\n"));
}
// Emit target-specific gunk after the function body.
EmitFunctionBodyEnd();

View File

@ -27,6 +27,7 @@
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/LiveVariables.h"
#include "llvm/CodeGen/PseudoSourceValue.h"
#include "llvm/MC/MCInst.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
@ -3766,3 +3767,9 @@ void X86InstrInfo::SetSSEDomain(MachineInstr *MI, unsigned Domain) const {
assert(table && "Cannot change domain");
MI->setDesc(get(table[Domain-1]));
}
/// getNoopForMachoTarget - Return the noop instruction to use for a noop.
void X86InstrInfo::getNoopForMachoTarget(MCInst &NopInst) const {
NopInst.setOpcode(X86::NOOP);
}

View File

@ -693,6 +693,8 @@ public:
int64_t Offset1, int64_t Offset2,
unsigned NumLoads) const;
virtual void getNoopForMachoTarget(MCInst &NopInst) const;
virtual
bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;

View File

@ -1,4 +1,4 @@
; RUN: llc < %s -march=ppc32 | grep .byte
; RUN: llc < %s -march=ppc32 | grep nop
target triple = "powerpc-apple-darwin8"

View File

@ -1,4 +1,4 @@
; RUN: llc < %s -march=x86 | grep {.byte 0}
; RUN: llc < %s -march=x86 | grep nop
target triple = "i686-apple-darwin8"