Index: llvm/lib/Target/Mips/MipsAsmPrinter.cpp |
=================================================================== |
old mode 100644 |
new mode 100755 |
--- a/llvm/lib/Target/Mips/MipsAsmPrinter.cpp |
+++ b/llvm/lib/Target/Mips/MipsAsmPrinter.cpp |
@@ -211,6 +211,17 @@ const char *MipsAsmPrinter::getCurrentAB |
} |
void MipsAsmPrinter::EmitFunctionEntryLabel() { |
+ // @LOCALMOD-START |
+ // make sure function entry is aligned. We use XmagicX as our basis |
+ // for alignment decisions (c.f. assembler sfi macros). |
+ int alignment = MF->getAlignment(); |
+ if (alignment < 4) alignment = 4; |
+ EmitAlignment(alignment); |
+ if (Subtarget->isTargetNaCl() && OutStreamer.hasRawTextSupport()) { |
+ OutStreamer.EmitRawText(StringRef("\t.set XmagicX, .\n")); |
+ } |
+ // @LOCALMOD-END |
+ |
OutStreamer.EmitRawText("\t.ent\t" + Twine(CurrentFnSym->getName())); |
OutStreamer.EmitLabel(CurrentFnSym); |
} |
@@ -414,6 +425,10 @@ printFCCOperand(const MachineInstr *MI, |
O << Mips::MipsFCCToString((Mips::CondCode)MO.getImm()); |
} |
+// @LOCALMOD-START |
+extern void EmitMipsSFIHeaders(raw_ostream &O); |
+// @LOCALMOD-END |
+ |
void MipsAsmPrinter::EmitStartOfAsmFile(Module &M) { |
// FIXME: Use SwitchSection. |
@@ -430,7 +445,35 @@ void MipsAsmPrinter::EmitStartOfAsmFile( |
// return to previous section |
OutStreamer.EmitRawText(StringRef("\t.previous")); |
+ |
+ // @LOCALMOD-START |
+ if (Subtarget->isTargetNaCl() && OutStreamer.hasRawTextSupport()) { |
+ std::string str; |
+ raw_string_ostream OS(str); |
+ EmitMipsSFIHeaders(OS); |
+ OutStreamer.EmitRawText(StringRef(OS.str())); |
+ } |
+ // @LOCALMOD-END |
} |
+ |
+// @LOCALMOD-START |
+unsigned MipsAsmPrinter::GetTargetLabelAlign(const MachineInstr *MI) const { |
+ if (Subtarget->isTargetNaCl()) { |
+ switch (MI->getOpcode()) { |
+ default: return 0; |
+ // These labels may indicate an indirect entry point that is |
+ // externally reachable and hence must be bundle aligned. |
+ // Note: these labels appear to be always at basic block beginnings |
+ // so it may be possible to simply set the MBB alignment. |
+ // However, it is unclear whether this always holds. |
+ case TargetOpcode::EH_LABEL: |
+ case TargetOpcode::GC_LABEL: |
+ return 4; |
+ } |
+ } |
+ return 0; |
+} |
+// @LOCALMOD-END |
MachineLocation |
MipsAsmPrinter::getDebugValueLocation(const MachineInstr *MI) const { |