Commit 87627246 authored by Hans Wennborg's avatar Hans Wennborg
Browse files

Merging r323536:

------------------------------------------------------------------------
r323536 | arichardson | 2018-01-26 16:56:14 +0100 (Fri, 26 Jan 2018) | 11 lines

[MIPS] Don't crash on unsized extern types with -mgpopt

Summary: This fixes an assertion when building the FreeBSD MIPS64 kernel.

Reviewers: atanasyan, sdardis, emaste

Reviewed By: sdardis

Subscribers: krytarowski, llvm-commits

Differential Revision: https://reviews.llvm.org/D42571
------------------------------------------------------------------------

llvm-svn: 324087
parent 6291b0d9
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -136,6 +136,13 @@ IsGlobalInSmallSectionImpl(const GlobalObject *GO,
    return false;

  Type *Ty = GVA->getValueType();

  // It is possible that the type of the global is unsized, i.e. a declaration
  // of a extern struct. In this case don't presume it is in the small data
  // section. This happens e.g. when building the FreeBSD kernel.
  if (!Ty->isSized())
    return false;

  return IsInSmallSection(
      GVA->getParent()->getDataLayout().getTypeAllocSize(Ty));
}
+22 −0
Original line number Diff line number Diff line
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; Check that -mgpopt doesn't crash on unsized externals
; RUN: llc -mtriple=mips64-unknown-freebsd -mattr=+noabicalls -target-abi n64 -mgpopt -o - %s | FileCheck %s

%struct.a = type opaque

@b = external global %struct.a, align 1

; Function Attrs: norecurse nounwind readnone
define %struct.a* @d() {
; CHECK-LABEL: d:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    lui $1, %highest(b)
; CHECK-NEXT:    daddiu $1, $1, %higher(b)
; CHECK-NEXT:    dsll $1, $1, 16
; CHECK-NEXT:    daddiu $1, $1, %hi(b)
; CHECK-NEXT:    dsll $1, $1, 16
; CHECK-NEXT:    jr $ra
; CHECK-NEXT:    daddiu $2, $1, %lo(b)
entry:
  ret %struct.a* @b
}