[llvm] [LoongArch] Insert nops and emit align reloc when handle alignment directive (PR #72962)
Lu Weining via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 16 05:04:34 PST 2024
================
@@ -174,6 +177,72 @@ void LoongArchAsmBackend::applyFixup(const MCAssembler &Asm,
}
}
+// Linker relaxation may change code size. We have to insert Nops
+// for .align directive when linker relaxation enabled. So then Linker
+// could satisfy alignment by removing Nops.
+// The function returns the total Nops Size we need to insert.
+bool LoongArchAsmBackend::shouldInsertExtraNopBytesForCodeAlign(
+ const MCAlignFragment &AF, unsigned &Size) {
+ // Calculate Nops Size only when linker relaxation enabled.
+ const MCSubtargetInfo *STI = AF.getSubtargetInfo();
+ if (!STI->hasFeature(LoongArch::FeatureRelax))
+ return false;
+
+ // Ignore alignment if the minimum Nop size is less than the MaxBytesToEmit.
+ const unsigned MinNopLen = 4;
+ if (AF.getMaxBytesToEmit() < MinNopLen)
+ return false;
+ Size = AF.getAlignment().value() - MinNopLen;
+ return AF.getAlignment() > MinNopLen;
+}
+
+// We need to insert R_LARCH_ALIGN relocation type to indicate the
+// position of Nops and the total bytes of the Nops have been inserted
+// when linker relaxation enabled.
+// The function inserts fixup_loongarch_align fixup which eventually will
+// transfer to R_LARCH_ALIGN relocation type.
+// The improved R_LARCH_ALIGN requires symbol index. The lowest 8 bits of
+// addend represent alignment and the other bits of addend represent the
+// maximum number of bytes to emit. The maximum number of bytes is zero
+// means ignore the emit limit.
----------------
SixWeining wrote:
```
// The maximum number of bytes is zero means ignore the emit limit.
```
Seems this is not the same as GAS.
https://github.com/llvm/llvm-project/pull/72962
More information about the llvm-commits
mailing list