-
Notifications
You must be signed in to change notification settings - Fork 11.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[LoongArch] Use R_LARCH_ALIGN without symbol as much as possible #93775
Conversation
In LoongArch psABI v2.30, the R_LARCH_ALIGN requires symbol index to to support the third parameter of alignment directive. Following this extended R_LARCH_ALIGN make the symbol index be redundant in some case. E.g. `.align 4` or `.align 4,,16`. Thus, use the extended R_LARCH_ALIGN only when the third parameter is effective. Otherwise use the orginal R_LARCH_ALIGN for simple.
@llvm/pr-subscribers-backend-loongarch @llvm/pr-subscribers-lld-elf Author: Lu Weining (SixWeining) ChangesIn LoongArch psABI v2.30, the R_LARCH_ALIGN requires symbol index to to support the third parameter of alignment directive. Following this extended R_LARCH_ALIGN make the symbol index be redundant in some case. E.g. This patch is from He Jinyang <hejinyang@loongson.cn>, also of Loongson. Full diff: https://github.com/llvm/llvm-project/pull/93775.diff 4 Files Affected:
diff --git a/lld/test/ELF/loongarch-relax-emit-relocs.s b/lld/test/ELF/loongarch-relax-emit-relocs.s
index 581fce8c95caa..ba414e8c93f0f 100644
--- a/lld/test/ELF/loongarch-relax-emit-relocs.s
+++ b/lld/test/ELF/loongarch-relax-emit-relocs.s
@@ -25,7 +25,7 @@
# CHECK-NEXT: R_LARCH_PCALA_LO12 _start
# CHECK-NEXT: R_LARCH_RELAX *ABS*
# CHECK-NEXT: nop
-# CHECK-NEXT: R_LARCH_ALIGN .Lla-relax-align0+0x4
+# CHECK-NEXT: R_LARCH_ALIGN *ABS*+0xc
# CHECK-NEXT: nop
# CHECK-NEXT: ret
@@ -37,7 +37,7 @@
# CHECKR-NEXT: R_LARCH_PCALA_LO12 _start
# CHECKR-NEXT: R_LARCH_RELAX *ABS*
# CHECKR-NEXT: nop
-# CHECKR-NEXT: R_LARCH_ALIGN .Lla-relax-align0+0x4
+# CHECKR-NEXT: R_LARCH_ALIGN *ABS*+0xc
# CHECKR-NEXT: nop
# CHECKR-NEXT: nop
# CHECKR-NEXT: ret
diff --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.cpp
index de492f2b1f0a4..1006cc42ad2ef 100644
--- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.cpp
+++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.cpp
@@ -224,20 +224,25 @@ bool LoongArchAsmBackend::shouldInsertFixupForCodeAlign(
// Create fixup_loongarch_align fixup.
MCFixup Fixup =
MCFixup::create(0, Dummy, MCFixupKind(LoongArch::fixup_loongarch_align));
- const MCSymbolRefExpr *MCSym = getSecToAlignSym()[Sec];
- if (MCSym == nullptr) {
- // Create a symbol and make the value of symbol is zero.
- MCSymbol *Sym = Ctx.createNamedTempSymbol("la-relax-align");
- Sym->setFragment(&*Sec->getBeginSymbol()->getFragment());
- Asm.registerSymbol(*Sym);
- MCSym = MCSymbolRefExpr::create(Sym, Ctx);
- getSecToAlignSym()[Sec] = MCSym;
- }
+
+ auto createExtendedValue = [&]() {
+ const MCSymbolRefExpr *MCSym = getSecToAlignSym()[Sec];
+ if (MCSym == nullptr) {
+ // Create a symbol and make the value of symbol is zero.
+ MCSymbol *Sym = Ctx.createNamedTempSymbol("la-relax-align");
+ Sym->setFragment(&*Sec->getBeginSymbol()->getFragment());
+ Asm.registerSymbol(*Sym);
+ MCSym = MCSymbolRefExpr::create(Sym, Ctx);
+ getSecToAlignSym()[Sec] = MCSym;
+ }
+ unsigned Lo = Log2_64(Count) + 1;
+ unsigned Hi = AF.getMaxBytesToEmit();
+ return MCValue::get(MCSym, nullptr, Hi << 8 | Lo);
+ };
uint64_t FixedValue = 0;
- unsigned Lo = Log2_64(Count) + 1;
- unsigned Hi = AF.getMaxBytesToEmit() >= Count ? 0 : AF.getMaxBytesToEmit();
- MCValue Value = MCValue::get(MCSym, nullptr, Hi << 8 | Lo);
+ MCValue Value = AF.getMaxBytesToEmit() >= Count ? MCValue::get(Count)
+ : createExtendedValue();
Asm.getWriter().recordRelocation(Asm, Layout, &AF, Fixup, Value, FixedValue);
return true;
diff --git a/llvm/test/MC/LoongArch/Relocations/relax-addsub.s b/llvm/test/MC/LoongArch/Relocations/relax-addsub.s
index 18e0ede5e2937..f2524b29d230b 100644
--- a/llvm/test/MC/LoongArch/Relocations/relax-addsub.s
+++ b/llvm/test/MC/LoongArch/Relocations/relax-addsub.s
@@ -28,7 +28,7 @@
# RELAX: Relocations [
# RELAX-NEXT: Section ({{.*}}) .rela.text {
-# RELAX-NEXT: 0x4 R_LARCH_ALIGN {{.*}} 0x4
+# RELAX-NEXT: 0x4 R_LARCH_ALIGN - 0xC
# RELAX-NEXT: 0x10 R_LARCH_PCALA_HI20 .L1 0x0
# RELAX-NEXT: 0x10 R_LARCH_RELAX - 0x0
# RELAX-NEXT: 0x14 R_LARCH_PCALA_LO12 .L1 0x0
diff --git a/llvm/test/MC/LoongArch/Relocations/relax-align.s b/llvm/test/MC/LoongArch/Relocations/relax-align.s
index 294fd9fb916c7..477d5ca24ec7d 100644
--- a/llvm/test/MC/LoongArch/Relocations/relax-align.s
+++ b/llvm/test/MC/LoongArch/Relocations/relax-align.s
@@ -63,17 +63,19 @@ ret
## Test the symbol index is different from .text.
.section .text2, "ax"
.p2align 4
+.p2align 4, , 4
break 7
# RELOC: Relocations [
# RELAX-RELOC-NEXT: Section ({{.*}}) .rela.text {
-# RELAX-RELOC-NEXT: 0x24 R_LARCH_ALIGN .Lla-relax-align0 0x4
-# RELAX-RELOC-NEXT: 0x34 R_LARCH_ALIGN .Lla-relax-align0 0x5
-# RELAX-RELOC-NEXT: 0x50 R_LARCH_ALIGN .Lla-relax-align0 0x4
+# RELAX-RELOC-NEXT: 0x24 R_LARCH_ALIGN - 0xC
+# RELAX-RELOC-NEXT: 0x34 R_LARCH_ALIGN - 0x1C
+# RELAX-RELOC-NEXT: 0x50 R_LARCH_ALIGN - 0xC
# RELAX-RELOC-NEXT: 0x60 R_LARCH_ALIGN .Lla-relax-align0 0xB04
-# RELAX-RELOC-NEXT: 0x70 R_LARCH_ALIGN .Lla-relax-align0 0x4
+# RELAX-RELOC-NEXT: 0x70 R_LARCH_ALIGN - 0xC
# RELAX-RELOC-NEXT: }
# RELAX-RELOC-NEXT: Section ({{.*}}) .rela.text2 {
-# RELAX-RELOC-NEXT: 0x0 R_LARCH_ALIGN .Lla-relax-align1 0x4
+# RELAX-RELOC-NEXT: 0x0 R_LARCH_ALIGN - 0xC
+# RELAX-RELOC-NEXT: 0xC R_LARCH_ALIGN .Lla-relax-align1 0x404
# RELAX-RELOC-NEXT: }
# RELOC-NEXT: ]
|
MCSym = MCSymbolRefExpr::create(Sym, Ctx); | ||
getSecToAlignSym()[Sec] = MCSym; | ||
} | ||
unsigned Lo = Log2_64(Count) + 1; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
prefer countr_zero
from llvm/ADT/bit.h
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, but I find Log2(AF.getAlignment())
is simpler.
llvm/Support/Alignment.h:
/// Returns the log2 of the alignment.
inline unsigned Log2(Align A) { return A.ShiftValue; }
"Squash and merge" assigns the author field to the PR author (not the patch author) and adds Co-authored-by tags for commit authors.
"... to support the third parameter of the alignment directive, R_LARCH_ALIGN relocations need a non-zero symbol index. |
To support the third parameter of the alignment directive, R_LARCH_ALIGN relocations need a non-zero symbol index.
In many cases we don't need the third parameter and can set the symbol index to 0.
This patch will remove a lot of .Lla-relax-align* symbols and mitigate the size regression due to #72962.
This patch is mainly from He Jinyang hejinyang@loongson.cn, also of Loongson.
Co-authored-by: Weining Lu luweining@loongson.cn