mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-17 00:27:31 +00:00
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:
parent
5aba2a8293
commit
9292bad5f5
@ -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 {
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: llc < %s -march=ppc32 | grep .byte
|
||||
; RUN: llc < %s -march=ppc32 | grep nop
|
||||
target triple = "powerpc-apple-darwin8"
|
||||
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: llc < %s -march=x86 | grep {.byte 0}
|
||||
; RUN: llc < %s -march=x86 | grep nop
|
||||
target triple = "i686-apple-darwin8"
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user