on darwin empty functions need to codegen into something of non-zero length,
authorChris Lattner <sabre@nondot.org>
Mon, 26 Apr 2010 23:37:21 +0000 (23:37 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 26 Apr 2010 23:37:21 +0000 (23:37 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@102400 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetInstrInfo.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/Target/X86/X86InstrInfo.cpp
lib/Target/X86/X86InstrInfo.h
test/CodeGen/PowerPC/2008-01-25-EmptyFunction.ll
test/CodeGen/X86/2008-01-25-EmptyFunction.ll

index 79ecbf83719c17360fca3e164c03706709209ad4..bce79ec879bae72be05b5a6a726d97746a4c43ad 100644 (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 {
index 6fc883359bebd77a5c6ab1771b0b7efef2c3d4f1..55eec53b4b63c07333d42cf22ce521f33b1aed3c 100644 (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();
index 4ed7434e45a054899c31326408930d4673e19230..9a41a4a525df9a5dd9b2e73e152c8ed0122a9396 100644 (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);
+}
+
index 3626f96b6aa77c37786c0e04f7de8f691e8a07d7..52a9050c1d1cfc565c934395ee7b859a5b42605d 100644 (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;
 
index a05245d542fcaf026c556ac5ed2e4933fe96cc7c..db2ab877ff7d22d032cdbadd8e9d5941241ba8eb 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc < %s -march=ppc32 | grep .byte
+; RUN: llc < %s -march=ppc32 | grep nop
 target triple = "powerpc-apple-darwin8"
 
 
index 387645f7436622004c9a0374d059789de08d9c22..b936686798f03121bec85a109992231a66fa44de 100644 (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"