]> granicus.if.org Git - llvm/commitdiff
[mips] Remove absolute size assertion for end directive
authorSimon Dardis <simon.dardis@imgtec.com>
Fri, 3 Feb 2017 15:48:53 +0000 (15:48 +0000)
committerSimon Dardis <simon.dardis@imgtec.com>
Fri, 3 Feb 2017 15:48:53 +0000 (15:48 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294012 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp
test/MC/Mips/end-directive.s [new file with mode: 0644]

index cfe70d867d9f2202ab8b46116cc0e7266306b4e5..59bd04a7fde77e9165c407786d16cec01071418f 100644 (file)
@@ -915,10 +915,10 @@ void MipsTargetELFStreamer::emitDirectiveEnd(StringRef Name) {
   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);
 }
 
diff --git a/test/MC/Mips/end-directive.s b/test/MC/Mips/end-directive.s
new file mode 100644 (file)
index 0000000..b295940
--- /dev/null
@@ -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,@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