SecBSD's official ports repository
This commit is contained in:
commit
2c0afcbbf3
64331 changed files with 5339189 additions and 0 deletions
|
@ -0,0 +1,68 @@
|
|||
- Use int3 trap padding between functions instead of trapsleds with a leading jump.
|
||||
- Emit trap alignment between basic blocks that are unreachable via
|
||||
fallthrough. Avoids unnecessary jmp instructions in the middle
|
||||
of functions and makes disassembly nicer to read.
|
||||
|
||||
Index: lib/CodeGen/AsmPrinter/AsmPrinter.cpp
|
||||
--- lib/CodeGen/AsmPrinter/AsmPrinter.cpp.orig
|
||||
+++ lib/CodeGen/AsmPrinter/AsmPrinter.cpp
|
||||
@@ -745,7 +745,7 @@ void AsmPrinter::emitFunctionHeader() {
|
||||
|
||||
emitLinkage(&F, CurrentFnSym);
|
||||
if (MAI->hasFunctionAlignment())
|
||||
- emitAlignment(MF->getAlignment(), &F);
|
||||
+ emitTrapAlignment(MF->getAlignment(), &F);
|
||||
|
||||
if (MAI->hasDotTypeDotSizeDirective())
|
||||
OutStreamer->emitSymbolAttribute(CurrentFnSym, MCSA_ELF_TypeFunction);
|
||||
@@ -2462,6 +2462,30 @@ void AsmPrinter::emitAlignment(Align Alignment, const
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
+/// emitTrapAlignment - Emit an alignment directive to the specified power of
|
||||
+/// two boundary, but call emitTrapToAlignment to fill with Trap instructions
|
||||
+/// if the Target implements emitTrapToAlignment.
|
||||
+void AsmPrinter::emitTrapAlignment(Align Alignment, const GlobalObject *GV) const {
|
||||
+ if (GV)
|
||||
+ Alignment = getGVAlignment(GV, GV->getParent()->getDataLayout(), Alignment);
|
||||
+
|
||||
+ if (Alignment == Align(1)) return; // 1-byte aligned: no need to emit alignment.
|
||||
+
|
||||
+ emitTrapToAlignment(Alignment);
|
||||
+}
|
||||
+
|
||||
+//===----------------------------------------------------------------------===//
|
||||
+/// emitTrapToAlignment - Emit an alignment directive to the specified power
|
||||
+/// of two boundary. This default implementation calls EmitCodeAlignment on
|
||||
+/// the OutStreamer, but can be overridden by Target implementations.
|
||||
+void AsmPrinter::emitTrapToAlignment(Align Alignment) const {
|
||||
+ if (Alignment == Align(1)) return;
|
||||
+ OutStreamer->emitCodeAlignment(Alignment.value());
|
||||
+}
|
||||
+
|
||||
+
|
||||
+
|
||||
+//===----------------------------------------------------------------------===//
|
||||
// Constant emission.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
@@ -3246,10 +3270,17 @@ void AsmPrinter::emitBasicBlockStart(const MachineBasi
|
||||
}
|
||||
}
|
||||
|
||||
+ bool isReachableViaFallthrough =
|
||||
+ std::find(MBB.pred_begin(), MBB.pred_end(), MBB.getPrevNode()) !=
|
||||
+ MBB.pred_end();
|
||||
// Emit an alignment directive for this block, if needed.
|
||||
const Align Alignment = MBB.getAlignment();
|
||||
- if (Alignment != Align(1))
|
||||
- emitAlignment(Alignment);
|
||||
+ if (Alignment != Align(1)) {
|
||||
+ if (isReachableViaFallthrough)
|
||||
+ emitAlignment(Alignment);
|
||||
+ else
|
||||
+ emitTrapAlignment(Alignment);
|
||||
+ }
|
||||
|
||||
// Switch to a new section if this basic block must begin a section. The
|
||||
// entry block is always placed in the function section and is handled
|
Loading…
Add table
Add a link
Reference in a new issue