[llvm] r253875 - [mips] .ent and .end should also set the type and size of the symbol respectively.
Daniel Sanders via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 23 08:08:04 PST 2015
Author: dsanders
Date: Mon Nov 23 10:08:03 2015
New Revision: 253875
URL: http://llvm.org/viewvc/llvm-project?rev=253875&view=rev
Log:
[mips] .ent and .end should also set the type and size of the symbol respectively.
Reviewers: vkalintiris
Subscribers: llvm-commits, seanbruno, emaste, vkalintiris, dsanders
Differential Revision: http://reviews.llvm.org/D14221
Added:
llvm/trunk/test/MC/Mips/directive-ent.s
Modified:
llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp
Modified: llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp?rev=253875&r1=253874&r2=253875&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp (original)
+++ llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp Mon Nov 23 10:08:03 2015
@@ -613,8 +613,9 @@ void MipsTargetELFStreamer::emitDirectiv
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 @@ void MipsTargetELFStreamer::emitDirectiv
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<MCSymbolELF *>(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<const MCSymbolELF &>(Symbol).setType(ELF::STT_FUNC);
}
void MipsTargetELFStreamer::emitDirectiveAbiCalls() {
Added: llvm/trunk/test/MC/Mips/directive-ent.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Mips/directive-ent.s?rev=253875&view=auto
==============================================================================
--- llvm/trunk/test/MC/Mips/directive-ent.s (added)
+++ llvm/trunk/test/MC/Mips/directive-ent.s Mon Nov 23 10:08:03 2015
@@ -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: }
More information about the llvm-commits
mailing list