Index: include/llvm/MC/MCExpr.h =================================================================== --- include/llvm/MC/MCExpr.h +++ include/llvm/MC/MCExpr.h @@ -278,6 +278,7 @@ VK_Mips_CALL_LO16, VK_Mips_PCREL_HI16, VK_Mips_PCREL_LO16, + VK_Mips_JALR, VK_COFF_IMGREL32 // symbol@imgrel (image-relative) }; Index: include/llvm/Support/ELF.h =================================================================== --- include/llvm/Support/ELF.h +++ include/llvm/Support/ELF.h @@ -977,6 +977,7 @@ R_MICROMIPS_GOT_DISP = 145, R_MICROMIPS_GOT_PAGE = 146, R_MICROMIPS_GOT_OFST = 147, + R_MICROMIPS_JALR = 156, R_MICROMIPS_TLS_GD = 162, R_MICROMIPS_TLS_LDM = 163, R_MICROMIPS_TLS_DTPREL_HI16 = 164, Index: lib/MC/MCExpr.cpp =================================================================== --- lib/MC/MCExpr.cpp +++ lib/MC/MCExpr.cpp @@ -279,6 +279,7 @@ case VK_Mips_CALL_LO16: return "CALL_LO16"; case VK_Mips_PCREL_HI16: return "PCREL_HI16"; case VK_Mips_PCREL_LO16: return "PCREL_LO16"; + case VK_Mips_JALR: return "JALR"; case VK_COFF_IMGREL32: return "IMGREL"; } llvm_unreachable("Invalid variant kind"); Index: lib/Object/ELF.cpp =================================================================== --- lib/Object/ELF.cpp +++ lib/Object/ELF.cpp @@ -179,6 +179,7 @@ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MICROMIPS_GOT_DISP); LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MICROMIPS_GOT_PAGE); LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MICROMIPS_GOT_OFST); + LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MICROMIPS_JALR); LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MICROMIPS_TLS_GD); LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MICROMIPS_TLS_LDM); LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_MICROMIPS_TLS_DTPREL_HI16); Index: lib/Object/ELFYAML.cpp =================================================================== --- lib/Object/ELFYAML.cpp +++ lib/Object/ELFYAML.cpp @@ -532,6 +532,7 @@ ECase(R_MICROMIPS_GOT_DISP) ECase(R_MICROMIPS_GOT_PAGE) ECase(R_MICROMIPS_GOT_OFST) + ECase(R_MICROMIPS_JALR) ECase(R_MICROMIPS_TLS_GD) ECase(R_MICROMIPS_TLS_LDM) ECase(R_MICROMIPS_TLS_DTPREL_HI16) Index: lib/Target/Mips/InstPrinter/MipsInstPrinter.cpp =================================================================== --- lib/Target/Mips/InstPrinter/MipsInstPrinter.cpp +++ lib/Target/Mips/InstPrinter/MipsInstPrinter.cpp @@ -168,6 +168,7 @@ case MCSymbolRefExpr::VK_Mips_CALL_LO16: OS << "%call_lo("; break; case MCSymbolRefExpr::VK_Mips_PCREL_HI16: OS << "%pcrel_hi("; break; case MCSymbolRefExpr::VK_Mips_PCREL_LO16: OS << "%pcrel_lo("; break; + case MCSymbolRefExpr::VK_Mips_JALR: break; } OS << SRE->getSymbol(); @@ -181,7 +182,8 @@ if ((Kind == MCSymbolRefExpr::VK_Mips_GPOFF_HI) || (Kind == MCSymbolRefExpr::VK_Mips_GPOFF_LO)) OS << ")))"; - else if (Kind != MCSymbolRefExpr::VK_None) + else if (Kind != MCSymbolRefExpr::VK_None && + Kind != MCSymbolRefExpr::VK_Mips_JALR) OS << ')'; } Index: lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp =================================================================== --- lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp +++ lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp @@ -57,6 +57,8 @@ case Mips::fixup_MICROMIPS_GOT_OFST: case Mips::fixup_MICROMIPS_GOT_DISP: case Mips::fixup_MIPS_PCLO16: + case Mips::fixup_MIPS_JALR: + case Mips::fixup_MICROMIPS_JALR: break; case Mips::fixup_Mips_PC16: // So far we are only using this type for branches. @@ -267,6 +269,7 @@ { "fixup_MIPS_PC26_S2", 0, 26, MCFixupKindInfo::FKF_IsPCRel }, { "fixup_MIPS_PCHI16", 0, 16, MCFixupKindInfo::FKF_IsPCRel }, { "fixup_MIPS_PCLO16", 0, 16, MCFixupKindInfo::FKF_IsPCRel }, + { "fixup_MIPS_JALR", 0, 32, 0 }, { "fixup_MICROMIPS_26_S1", 0, 26, 0 }, { "fixup_MICROMIPS_HI16", 0, 16, 0 }, { "fixup_MICROMIPS_LO16", 0, 16, 0 }, @@ -276,6 +279,7 @@ { "fixup_MICROMIPS_GOT_DISP", 0, 16, 0 }, { "fixup_MICROMIPS_GOT_PAGE", 0, 16, 0 }, { "fixup_MICROMIPS_GOT_OFST", 0, 16, 0 }, + { "fixup_MICROMIPS_JALR", 0, 32, 0 }, { "fixup_MICROMIPS_TLS_GD", 0, 16, 0 }, { "fixup_MICROMIPS_TLS_LDM", 0, 16, 0 }, { "fixup_MICROMIPS_TLS_DTPREL_HI16", 0, 16, 0 }, @@ -330,6 +334,7 @@ { "fixup_MIPS_PC26_S2", 6, 26, MCFixupKindInfo::FKF_IsPCRel }, { "fixup_MIPS_PCHI16", 16, 16, MCFixupKindInfo::FKF_IsPCRel }, { "fixup_MIPS_PCLO16", 16, 16, MCFixupKindInfo::FKF_IsPCRel }, + { "fixup_MIPS_JALR", 0, 32, 0 }, { "fixup_MICROMIPS_26_S1", 6, 26, 0 }, { "fixup_MICROMIPS_HI16", 16, 16, 0 }, { "fixup_MICROMIPS_LO16", 16, 16, 0 }, @@ -339,6 +344,7 @@ { "fixup_MICROMIPS_GOT_DISP", 16, 16, 0 }, { "fixup_MICROMIPS_GOT_PAGE", 16, 16, 0 }, { "fixup_MICROMIPS_GOT_OFST", 16, 16, 0 }, + { "fixup_MICROMIPS_JALR", 0, 32, 0 }, { "fixup_MICROMIPS_TLS_GD", 16, 16, 0 }, { "fixup_MICROMIPS_TLS_LDM", 16, 16, 0 }, { "fixup_MICROMIPS_TLS_DTPREL_HI16", 16, 16, 0 }, Index: lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp =================================================================== --- lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp +++ lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp @@ -176,6 +176,9 @@ case Mips::fixup_MICROMIPS_GOT_OFST: Type = ELF::R_MICROMIPS_GOT_OFST; break; + case Mips::fixup_MICROMIPS_JALR: + Type = ELF::R_MICROMIPS_JALR; + break; case Mips::fixup_MICROMIPS_TLS_GD: Type = ELF::R_MICROMIPS_TLS_GD; break; @@ -212,6 +215,9 @@ case Mips::fixup_MIPS_PCLO16: Type = ELF::R_MIPS_PCLO16; break; + case Mips::fixup_MIPS_JALR: + Type = ELF::R_MIPS_JALR; + break; } return Type; } Index: lib/Target/Mips/MCTargetDesc/MipsFixupKinds.h =================================================================== --- lib/Target/Mips/MCTargetDesc/MipsFixupKinds.h +++ lib/Target/Mips/MCTargetDesc/MipsFixupKinds.h @@ -146,6 +146,9 @@ // resulting in - R_MIPS_PCLO16 fixup_MIPS_PCLO16, + // resulting in - R_MIPS_JALR + fixup_MIPS_JALR, + // resulting in - R_MICROMIPS_26_S1 fixup_MICROMIPS_26_S1, @@ -173,6 +176,9 @@ // resulting in - R_MICROMIPS_GOT_OFST fixup_MICROMIPS_GOT_OFST, + // resulting in - R_MICROMIPS_JALR + fixup_MICROMIPS_JALR, + // resulting in - R_MICROMIPS_TLS_GD fixup_MICROMIPS_TLS_GD, Index: lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp =================================================================== --- lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp +++ lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp @@ -496,6 +496,10 @@ FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_LO16 : Mips::fixup_Mips_LO16; break; + case MCSymbolRefExpr::VK_Mips_JALR: + FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_JALR + : Mips::fixup_MIPS_JALR; + break; case MCSymbolRefExpr::VK_Mips_TLSGD: FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_GD : Mips::fixup_Mips_TLSGD;