From 43d59dee0930bf922773f7d009b2db7297db7972 Mon Sep 17 00:00:00 2001 From: YunQiang Su Date: Sun, 4 Feb 2024 14:46:10 +0800 Subject: [PATCH 1/4] MIPS/Asm/O32: Don't add another $ to PrivateGlobal symbol For asm code like: xx: la $2,$yy $yy: nop MIPS O32 use `$` as PrivateGlobalPrefix, while another `$` is added for getOrCreateSymbol, thus: error: Undefined temporary symbol $$yy We also set symbols that starts with `.L` as local for O32. See: #65020. --- .../Target/Mips/AsmParser/MipsAsmParser.cpp | 7 +++++- llvm/test/CodeGen/Mips/hf1_body.ll | 4 ++-- llvm/test/MC/Mips/macro-la-local.s | 23 +++++++++++++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 llvm/test/MC/Mips/macro-la-local.s diff --git a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index 3c673ae938fde..2ddd8a6f31756 100644 --- a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -2920,6 +2920,11 @@ bool MipsAsmParser::loadAndAddSymbolAddress(const MCExpr *SymExpr, (Res.getSymA()->getSymbol().isELF() && cast(Res.getSymA()->getSymbol()).getBinding() == ELF::STB_LOCAL); + if (!IsLocalSym && ABI.IsO32()) { + // PrivateGlobalPrefix for O32 is '$', while we support '.L' anyway. + if (Res.getSymA()->getSymbol().getName().starts_with(".L")) + IsLocalSym = true; + } bool UseXGOT = STI->hasFeature(Mips::FeatureXGOT) && !IsLocalSym; // The case where the result register is $25 is somewhat special. If the @@ -6359,7 +6364,7 @@ bool MipsAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic) { return true; SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); - MCSymbol *Sym = getContext().getOrCreateSymbol("$" + Identifier); + MCSymbol *Sym = getContext().getOrCreateSymbol(Identifier); // Otherwise create a symbol reference. const MCExpr *SymRef = MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); diff --git a/llvm/test/CodeGen/Mips/hf1_body.ll b/llvm/test/CodeGen/Mips/hf1_body.ll index 184ea31bddc9d..c3dea67896210 100644 --- a/llvm/test/CodeGen/Mips/hf1_body.ll +++ b/llvm/test/CodeGen/Mips/hf1_body.ll @@ -23,8 +23,8 @@ entry: ; ALL: .set reorder ; ALL: .reloc 0, R_MIPS_NONE, v_sf ; GAS: la $25, $__fn_local_v_sf -; IAS: lw $25, %got($$__fn_local_v_sf)($gp) -; IAS: addiu $25, $25, %lo($$__fn_local_v_sf) +; IAS: lw $25, %got($__fn_local_v_sf)($gp) +; IAS: addiu $25, $25, %lo($__fn_local_v_sf) ; ALL: mfc1 $4, $f12 ; ALL: jr $25 ; ALL: .end __fn_stub_v_sf diff --git a/llvm/test/MC/Mips/macro-la-local.s b/llvm/test/MC/Mips/macro-la-local.s new file mode 100644 index 0000000000000..14c8e1b689ac9 --- /dev/null +++ b/llvm/test/MC/Mips/macro-la-local.s @@ -0,0 +1,23 @@ +# RUN: llvm-mc %s -triple=mips-unknown-linux -show-encoding -mcpu=mips32r2 | \ +# RUN: FileCheck %s --check-prefixes=CHECK +# RUN: llvm-mc %s -triple=mips-unknown-linux -show-encoding -mcpu=mips32r6 | \ +# RUN: FileCheck %s --check-prefixes=CHECK + + .text + .abicalls + .option pic2 +xx: + la $2,.Lhello #CHECK: lw $2, %got(.Lhello)($gp) # encoding: [0x8f,0x82,A,A] + #CHECK: # fixup A - offset: 0, value: %got(.Lhello), kind: fixup_Mips_GOT + #CHECK: addiu $2, $2, %lo(.Lhello) # encoding: [0x24,0x42,A,A] + #CHECK: # fixup A - offset: 0, value: %lo(.Lhello), kind: fixup_Mips_LO16 + + la $2,$hello2 #CHECK: lw $2, %got($hello2)($gp) # encoding: [0x8f,0x82,A,A] + #CHECK: # fixup A - offset: 0, value: %got($hello2), kind: fixup_Mips_GOT + #CHECK: addiu $2, $2, %lo($hello2) # encoding: [0x24,0x42,A,A] + #CHECK: # fixup A - offset: 0, value: %lo($hello2), kind: fixup_Mips_LO16 + .rdata +.Lhello: + .asciz "Hello world\n" +$hello2: + .asciz "Hello world\n" From c8f05b19b3a3191e303cfe2c899ef0300014feee Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Tue, 13 Feb 2024 00:34:59 -0800 Subject: [PATCH 2/4] Update MipsAsmParser.cpp --- llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index 2ddd8a6f31756..b001b3782b853 100644 --- a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -1,4 +1,4 @@ -//===-- MipsAsmParser.cpp - Parse Mips assembly to MCInst instructions ----===// +///===-- MipsAsmParser.cpp - Parse Mips assembly to MCInst instructions ----===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -2920,11 +2920,11 @@ bool MipsAsmParser::loadAndAddSymbolAddress(const MCExpr *SymExpr, (Res.getSymA()->getSymbol().isELF() && cast(Res.getSymA()->getSymbol()).getBinding() == ELF::STB_LOCAL); - if (!IsLocalSym && ABI.IsO32()) { - // PrivateGlobalPrefix for O32 is '$', while we support '.L' anyway. - if (Res.getSymA()->getSymbol().getName().starts_with(".L")) - IsLocalSym = true; - } + // For O32, "$"-prefixed symbols are recognized as temporary while + // .L-prefixed symbols are not (PrivateGlobalPrefix is "$"). Recognize ".L" + // manually. + if (ABI.IsO32() && Res.getSymA()->getSymbol().getName().starts_with(".L")) + IsLocalSym = true; bool UseXGOT = STI->hasFeature(Mips::FeatureXGOT) && !IsLocalSym; // The case where the result register is $25 is somewhat special. If the From a760ac793b9915163fed1b275424b7830ba73758 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Tue, 13 Feb 2024 00:36:00 -0800 Subject: [PATCH 3/4] Update MipsAsmParser.cpp --- llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index b001b3782b853..36aab383da68d 100644 --- a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -1,4 +1,4 @@ -///===-- MipsAsmParser.cpp - Parse Mips assembly to MCInst instructions ----===// +//===-- MipsAsmParser.cpp - Parse Mips assembly to MCInst instructions ----===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. From 800d8be4eaed0838e68ff81b2f4fbe34085ab879 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Tue, 13 Feb 2024 22:03:43 -0800 Subject: [PATCH 4/4] Fold tests into macro-la-pic.s --- llvm/test/MC/Mips/macro-la-local.s | 23 ----------------------- llvm/test/MC/Mips/macro-la-pic.s | 22 ++++++++++++++++++++++ 2 files changed, 22 insertions(+), 23 deletions(-) delete mode 100644 llvm/test/MC/Mips/macro-la-local.s diff --git a/llvm/test/MC/Mips/macro-la-local.s b/llvm/test/MC/Mips/macro-la-local.s deleted file mode 100644 index 14c8e1b689ac9..0000000000000 --- a/llvm/test/MC/Mips/macro-la-local.s +++ /dev/null @@ -1,23 +0,0 @@ -# RUN: llvm-mc %s -triple=mips-unknown-linux -show-encoding -mcpu=mips32r2 | \ -# RUN: FileCheck %s --check-prefixes=CHECK -# RUN: llvm-mc %s -triple=mips-unknown-linux -show-encoding -mcpu=mips32r6 | \ -# RUN: FileCheck %s --check-prefixes=CHECK - - .text - .abicalls - .option pic2 -xx: - la $2,.Lhello #CHECK: lw $2, %got(.Lhello)($gp) # encoding: [0x8f,0x82,A,A] - #CHECK: # fixup A - offset: 0, value: %got(.Lhello), kind: fixup_Mips_GOT - #CHECK: addiu $2, $2, %lo(.Lhello) # encoding: [0x24,0x42,A,A] - #CHECK: # fixup A - offset: 0, value: %lo(.Lhello), kind: fixup_Mips_LO16 - - la $2,$hello2 #CHECK: lw $2, %got($hello2)($gp) # encoding: [0x8f,0x82,A,A] - #CHECK: # fixup A - offset: 0, value: %got($hello2), kind: fixup_Mips_GOT - #CHECK: addiu $2, $2, %lo($hello2) # encoding: [0x24,0x42,A,A] - #CHECK: # fixup A - offset: 0, value: %lo($hello2), kind: fixup_Mips_LO16 - .rdata -.Lhello: - .asciz "Hello world\n" -$hello2: - .asciz "Hello world\n" diff --git a/llvm/test/MC/Mips/macro-la-pic.s b/llvm/test/MC/Mips/macro-la-pic.s index 2303f34c35bcf..1875952d80c4e 100644 --- a/llvm/test/MC/Mips/macro-la-pic.s +++ b/llvm/test/MC/Mips/macro-la-pic.s @@ -255,3 +255,25 @@ la $25, 2f # XN32: lw $25, %got_disp(.Ltmp1)($gp) # encoding: [0x8f,0x99,A,A] # XN32: # fixup A - offset: 0, value: %got_disp(.Ltmp1), kind: fixup_Mips_GOT_DISP 2: + +la $2,.Lstr +# O32: lw $2, %got(.Lstr)($gp) # encoding: [0x8f,0x82,A,A] +# O32-NEXT: # fixup A - offset: 0, value: %got(.Lstr), kind: fixup_Mips_GOT +# O32-NEXT: addiu $2, $2, %lo(.Lstr) # encoding: [0x24,0x42,A,A] +# O32-NEXT: # fixup A - offset: 0, value: %lo(.Lstr), kind: fixup_Mips_LO16 + +# N32: lw $2, %got_disp(.Lstr)($gp) # encoding: [0x8f,0x82,A,A] +# N32-NEXT: # fixup A - offset: 0, value: %got_disp(.Lstr), kind: fixup_Mips_GOT_DISP + +la $2,$str2 +# O32: lw $2, %got($str2)($gp) # encoding: [0x8f,0x82,A,A] +# O32-NEXT: # fixup A - offset: 0, value: %got($str2), kind: fixup_Mips_GOT +# O32-NEXT: addiu $2, $2, %lo($str2) # encoding: [0x24,0x42,A,A] +# O32-NEXT: # fixup A - offset: 0, value: %lo($str2), kind: fixup_Mips_LO16 + +# N32: lw $2, %got_disp($str2)($gp) # encoding: [0x8f,0x82,A,A] +# N32-NEXT: # fixup A - offset: 0, value: %got_disp($str2), kind: fixup_Mips_GOT_DISP + +.rodata +.Lstr: .4byte 0 +$str2: .4byte 0