From owner-svn-src-head@freebsd.org Tue Jan 30 16:43:22 2018 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id D56F4ED4EA7; Tue, 30 Jan 2018 16:43:21 +0000 (UTC) (envelope-from emaste@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 87BFA75840; Tue, 30 Jan 2018 16:43:21 +0000 (UTC) (envelope-from emaste@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 82A7819D08; Tue, 30 Jan 2018 16:43:21 +0000 (UTC) (envelope-from emaste@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id w0UGhLn2075655; Tue, 30 Jan 2018 16:43:21 GMT (envelope-from emaste@FreeBSD.org) Received: (from emaste@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id w0UGhKR6075651; Tue, 30 Jan 2018 16:43:20 GMT (envelope-from emaste@FreeBSD.org) Message-Id: <201801301643.w0UGhKR6075651@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: emaste set sender to emaste@FreeBSD.org using -f From: Ed Maste Date: Tue, 30 Jan 2018 16:43:20 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r328596 - in head/contrib/llvm: include/llvm/MC lib/MC X-SVN-Group: head X-SVN-Commit-Author: emaste X-SVN-Commit-Paths: in head/contrib/llvm: include/llvm/MC lib/MC X-SVN-Commit-Revision: 328596 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 30 Jan 2018 16:43:22 -0000 Author: emaste Date: Tue Jan 30 16:43:20 2018 New Revision: 328596 URL: https://svnweb.freebsd.org/changeset/base/328596 Log: Pull in r322131 from upstream llvm trunk (by Rafael EspĂ­ndola): Use a MCExpr for the size of MCFillFragment. This allows the size to be found during ralaxation. This fixes [LLVM] pr35858. Requested by: royger Modified: head/contrib/llvm/include/llvm/MC/MCFragment.h head/contrib/llvm/lib/MC/MCAssembler.cpp head/contrib/llvm/lib/MC/MCObjectStreamer.cpp head/contrib/llvm/lib/MC/WasmObjectWriter.cpp Modified: head/contrib/llvm/include/llvm/MC/MCFragment.h ============================================================================== --- head/contrib/llvm/include/llvm/MC/MCFragment.h Tue Jan 30 16:42:08 2018 (r328595) +++ head/contrib/llvm/include/llvm/MC/MCFragment.h Tue Jan 30 16:43:20 2018 (r328596) @@ -422,14 +422,21 @@ class MCFillFragment : public MCFragment { uint8_t Value; /// The number of bytes to insert. - uint64_t Size; + const MCExpr &Size; + /// Source location of the directive that this fragment was created for. + SMLoc Loc; + public: - MCFillFragment(uint8_t Value, uint64_t Size, MCSection *Sec = nullptr) - : MCFragment(FT_Fill, false, 0, Sec), Value(Value), Size(Size) {} + MCFillFragment(uint8_t Value, const MCExpr &Size, SMLoc Loc, + MCSection *Sec = nullptr) + : MCFragment(FT_Fill, false, 0, Sec), Value(Value), Size(Size), Loc(Loc) { + } uint8_t getValue() const { return Value; } - uint64_t getSize() const { return Size; } + const MCExpr &getSize() const { return Size; } + + SMLoc getLoc() const { return Loc; } static bool classof(const MCFragment *F) { return F->getKind() == MCFragment::FT_Fill; Modified: head/contrib/llvm/lib/MC/MCAssembler.cpp ============================================================================== --- head/contrib/llvm/lib/MC/MCAssembler.cpp Tue Jan 30 16:42:08 2018 (r328595) +++ head/contrib/llvm/lib/MC/MCAssembler.cpp Tue Jan 30 16:43:20 2018 (r328596) @@ -281,8 +281,18 @@ uint64_t MCAssembler::computeFragmentSize(const MCAsmL return cast(F).getContents().size(); case MCFragment::FT_CompactEncodedInst: return cast(F).getContents().size(); - case MCFragment::FT_Fill: - return cast(F).getSize(); + case MCFragment::FT_Fill: { + auto &FF = cast(F); + int64_t Size = 0; + if (!FF.getSize().evaluateAsAbsolute(Size, Layout)) + getContext().reportError(FF.getLoc(), + "expected assembly-time absolute expression"); + if (Size < 0) { + getContext().reportError(FF.getLoc(), "invalid number of bytes"); + return 0; + } + return Size; + } case MCFragment::FT_LEB: return cast(F).getContents().size(); @@ -540,7 +550,7 @@ static void writeFragment(const MCAssembler &Asm, cons for (unsigned I = 1; I < MaxChunkSize; ++I) Data[I] = Data[0]; - uint64_t Size = FF.getSize(); + uint64_t Size = FragmentSize; for (unsigned ChunkSize = MaxChunkSize; ChunkSize; ChunkSize /= 2) { StringRef Ref(Data, ChunkSize); for (uint64_t I = 0, E = Size / ChunkSize; I != E; ++I) Modified: head/contrib/llvm/lib/MC/MCObjectStreamer.cpp ============================================================================== --- head/contrib/llvm/lib/MC/MCObjectStreamer.cpp Tue Jan 30 16:42:08 2018 (r328595) +++ head/contrib/llvm/lib/MC/MCObjectStreamer.cpp Tue Jan 30 16:43:20 2018 (r328596) @@ -582,19 +582,8 @@ void MCObjectStreamer::emitFill(const MCExpr &NumBytes MCDataFragment *DF = getOrCreateDataFragment(); flushPendingLabels(DF, DF->getContents().size()); - int64_t IntNumBytes; - if (!NumBytes.evaluateAsAbsolute(IntNumBytes, getAssembler())) { - getContext().reportError(Loc, "expected absolute expression"); - return; - } - - if (IntNumBytes < 0) { - getContext().reportError(Loc, "invalid number of bytes"); - return; - } - assert(getCurrentSectionOnly() && "need a section"); - insert(new MCFillFragment(FillValue, IntNumBytes)); + insert(new MCFillFragment(FillValue, NumBytes, Loc)); } void MCObjectStreamer::emitFill(const MCExpr &NumValues, int64_t Size, Modified: head/contrib/llvm/lib/MC/WasmObjectWriter.cpp ============================================================================== --- head/contrib/llvm/lib/MC/WasmObjectWriter.cpp Tue Jan 30 16:42:08 2018 (r328595) +++ head/contrib/llvm/lib/MC/WasmObjectWriter.cpp Tue Jan 30 16:43:20 2018 (r328596) @@ -528,7 +528,10 @@ static void addData(SmallVectorImpl &DataBytes, Align->getMaxBytesToEmit()); DataBytes.resize(Size, Value); } else if (auto *Fill = dyn_cast(&Frag)) { - DataBytes.insert(DataBytes.end(), Fill->getSize(), Fill->getValue()); + int64_t Size; + if (!Fill->getSize().evaluateAsAbsolute(Size)) + llvm_unreachable("The fill should be an assembler constant"); + DataBytes.insert(DataBytes.end(), Size, Fill->getValue()); } else { const auto &DataFrag = cast(Frag); const SmallVectorImpl &Contents = DataFrag.getContents();