Index: lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp =================================================================== --- lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp +++ lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp @@ -613,8 +613,9 @@ MCSectionELF *Sec = Context.getELFSection(".pdr", ELF::SHT_PROGBITS, ELF::SHF_ALLOC | ELF::SHT_REL); + MCSymbol *Sym = Context.getOrCreateSymbol(Name); const MCSymbolRefExpr *ExprRef = - MCSymbolRefExpr::create(Name, MCSymbolRefExpr::VK_None, Context); + MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, Context); MCA.registerSection(*Sec); Sec->setAlignment(4); @@ -640,10 +641,25 @@ GPRInfoSet = FPRInfoSet = FrameInfoSet = false; OS.PopSection(); + + // .end also implicitly sets the size. + MCSymbol *CurPCSym = Context.createTempSymbol(); + OS.EmitLabel(CurPCSym); + const MCExpr *Size = MCBinaryExpr::createSub( + MCSymbolRefExpr::create(CurPCSym, MCSymbolRefExpr::VK_None, Context), + ExprRef, Context); + int64_t AbsSize; + if (!Size->evaluateAsAbsolute(AbsSize, MCA)) + llvm_unreachable("Function size must be evaluatable as absolute"); + Size = MCConstantExpr::create(AbsSize, Context); + static_cast(Sym)->setSize(Size); } void MipsTargetELFStreamer::emitDirectiveEnt(const MCSymbol &Symbol) { GPRInfoSet = FPRInfoSet = FrameInfoSet = false; + + // .ent also acts like an implicit '.type symbol, STT_FUNC' + static_cast(Symbol).setType(ELF::STT_FUNC); } void MipsTargetELFStreamer::emitDirectiveAbiCalls() { Index: test/MC/Mips/directive-ent.s =================================================================== --- /dev/null +++ test/MC/Mips/directive-ent.s @@ -0,0 +1,50 @@ +# The effects of .ent on the .pdr section are tested in mips-pdr*.s. Test +# everything else here. +# +# RUN: llvm-mc -mcpu=mips32 -triple mips-unknown-unknown %s | \ +# RUN: FileCheck -check-prefix=ASM %s +# RUN: llvm-mc -filetype=obj -mcpu=mips32 -triple mips-unknown-unknown %s | \ +# RUN: llvm-readobj -symbols | \ +# RUN: FileCheck -check-prefix=OBJ -check-prefix=OBJ-32 %s +# +# RUN: llvm-mc -mcpu=mips32 -mattr=micromips -triple mips-unknown-unknown %s | \ +# RUN: FileCheck -check-prefix=ASM %s +# RUN: llvm-mc -filetype=obj -mcpu=mips32 -mattr=micromips \ +# RUN: -triple mips-unknown-unknown %s | \ +# RUN: llvm-readobj -symbols | \ +# RUN: FileCheck -check-prefix=OBJ -check-prefix=OBJ-MM %s +# + .ent a +a: + +# ASM: .ent a +# ASM: a: + +# OBJ: Name: a +# OBJ: Value: 0x0 +# OBJ: Size: 0 +# OBJ: Binding: Local +# OBJ: Type: Function +# OBJ: Other: 0 +# OBJ: Section: .text +# OBJ: } + + .ent b +b: + nop + nop + .end b + +# ASM: .ent b +# ASM: b: + +# OBJ: Name: b +# OBJ: Value: 0x0 +# OBJ-32: Size: 8 +# FIXME: microMIPS uses the 4-byte nop instead of the 2-byte nop. +# OBJ-MM: Size: 8 +# OBJ: Binding: Local +# OBJ: Type: Function +# OBJ: Other: 0 +# OBJ: Section: .text +# OBJ: }