Index: llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp =================================================================== --- llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp +++ llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp @@ -11,6 +11,7 @@ #include "MCTargetDesc/MipsFixupKinds.h" #include "MCTargetDesc/MipsMCTargetDesc.h" #include "llvm/MC/MCAssembler.h" +#include "llvm/MC/MCELF.h" #include "llvm/MC/MCELFObjectWriter.h" #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCSection.h" @@ -244,8 +245,11 @@ case ELF::R_MICROMIPS_LO16: return true; - case ELF::R_MIPS_26: case ELF::R_MIPS_32: + if (MCELF::getOther(SD) & (ELF::STO_MIPS_MICROMIPS >> 2)) + return true; + // falltrough + case ELF::R_MIPS_26: case ELF::R_MIPS_64: case ELF::R_MIPS_GPREL16: return false; Index: llvm/trunk/test/MC/Mips/micromips-func-addr.s =================================================================== --- llvm/trunk/test/MC/Mips/micromips-func-addr.s +++ llvm/trunk/test/MC/Mips/micromips-func-addr.s @@ -0,0 +1,16 @@ +# RUN: llvm-mc %s -filetype=obj -triple=mipsel-unknown-linux \ +# RUN: -mattr=micromips | llvm-readobj -r \ +# RUN: | FileCheck %s -check-prefix=CHECK +# CHECK: Relocations [ +# CHECK: 0x0 R_MIPS_32 bar 0x0 +# CHECK: 0x4 R_MIPS_32 L1 0x0 + + .set micromips + .type bar,@function +bar: +L1: + nop + .data + .4byte bar + .4byte L1 +