[llvm] r294012 - [mips] Remove absolute size assertion for end directive

Simon Dardis via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 3 07:48:54 PST 2017


Author: sdardis
Date: Fri Feb  3 09:48:53 2017
New Revision: 294012

URL: http://llvm.org/viewvc/llvm-project?rev=294012&view=rev
Log:
[mips] Remove absolute size assertion for end directive

The .end <symbol> directive for MIPS marks the end of a symbol and sets the
symbol's size. Previously, the corresponding emitDirective handler asserted
that a function's size could be evaluated to an absolute value at that point
in time.

This cannot be done with when directives like .align have been encountered,
instead set the function's size to the corresponding symbolic expression and
let ELFObjectWriter resolve the expression to an absolute value. This avoids
a redundant call to evaluateAsAbsolute.


Added:
    llvm/trunk/test/MC/Mips/end-directive.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=294012&r1=294011&r2=294012&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp (original)
+++ llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp Fri Feb  3 09:48:53 2017
@@ -915,10 +915,10 @@ void MipsTargetELFStreamer::emitDirectiv
   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);
+
+  // The ELFObjectWriter can determine the absolute size as it has access to
+  // the layout information of the assembly file, so a size expression rather
+  // than an absolute value is ok here.
   static_cast<MCSymbolELF *>(Sym)->setSize(Size);
 }
 

Added: llvm/trunk/test/MC/Mips/end-directive.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Mips/end-directive.s?rev=294012&view=auto
==============================================================================
--- llvm/trunk/test/MC/Mips/end-directive.s (added)
+++ llvm/trunk/test/MC/Mips/end-directive.s Fri Feb  3 09:48:53 2017
@@ -0,0 +1,22 @@
+# RUN: llvm-mc -arch=mips -mcpu=mips32 -filetype=obj %s -o - | \
+# RUN:   llvm-readobj -symbols | FileCheck %s
+
+# Check that the assembler doesn't choke on .align between a symbol and the
+# .end directive.
+
+	.text
+	.globl	a
+	.p2align	2
+	.type	a, at function
+	.ent	a
+a:
+	addu	$2, $5, $4
+	.align 4
+	jr	$ra
+	.end	a
+$func_end0:
+	.size	a, ($func_end0)-a
+
+# CHECK: Name: a
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 24




More information about the llvm-commits mailing list