-
Notifications
You must be signed in to change notification settings - Fork 11.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[LLVM][LTO] Factor out RTLib calls and allow them to be dropped (#98512)
Summary: The LTO pass and LLD linker have logic in them that forces extraction and prevent internalization of needed runtime calls. However, these currently take all RTLibcalls into account, even if the target does not support them. The target opts-out of a libcall if it sets its name to nullptr. This patch pulls this logic out into a class in the header so that LTO / lld can use it to determine if a symbol actually needs to be kept. This is important for targets like AMDGPU that want to be able to use `lld` to perform the final link step, but does not want the overhead of uncalled functions. (This adds like a second to the link time trivially) Test Plan: Reviewers: Subscribers: Tasks: Tags: Differential Revision: https://phabricator.intern.facebook.com/D60251770
- Loading branch information
1 parent
6a53959
commit cbd3a30
Showing
37 changed files
with
676 additions
and
568 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
//===-- CodeGen/RuntimeLibcallUtil.h - Runtime Library Calls ----*- C++ -*-===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file defines some helper functions for runtime library calls. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLVM_CODEGEN_RUNTIMELIBCALLS_H | ||
#define LLVM_CODEGEN_RUNTIMELIBCALLS_H | ||
|
||
#include "llvm/CodeGen/ValueTypes.h" | ||
#include "llvm/IR/RuntimeLibcalls.h" | ||
#include "llvm/Support/AtomicOrdering.h" | ||
|
||
namespace llvm { | ||
namespace RTLIB { | ||
|
||
/// GetFPLibCall - Helper to return the right libcall for the given floating | ||
/// point type, or UNKNOWN_LIBCALL if there is none. | ||
Libcall getFPLibCall(EVT VT, Libcall Call_F32, Libcall Call_F64, | ||
Libcall Call_F80, Libcall Call_F128, Libcall Call_PPCF128); | ||
|
||
/// getFPEXT - Return the FPEXT_*_* value for the given types, or | ||
/// UNKNOWN_LIBCALL if there is none. | ||
Libcall getFPEXT(EVT OpVT, EVT RetVT); | ||
|
||
/// getFPROUND - Return the FPROUND_*_* value for the given types, or | ||
/// UNKNOWN_LIBCALL if there is none. | ||
Libcall getFPROUND(EVT OpVT, EVT RetVT); | ||
|
||
/// getFPTOSINT - Return the FPTOSINT_*_* value for the given types, or | ||
/// UNKNOWN_LIBCALL if there is none. | ||
Libcall getFPTOSINT(EVT OpVT, EVT RetVT); | ||
|
||
/// getFPTOUINT - Return the FPTOUINT_*_* value for the given types, or | ||
/// UNKNOWN_LIBCALL if there is none. | ||
Libcall getFPTOUINT(EVT OpVT, EVT RetVT); | ||
|
||
/// getSINTTOFP - Return the SINTTOFP_*_* value for the given types, or | ||
/// UNKNOWN_LIBCALL if there is none. | ||
Libcall getSINTTOFP(EVT OpVT, EVT RetVT); | ||
|
||
/// getUINTTOFP - Return the UINTTOFP_*_* value for the given types, or | ||
/// UNKNOWN_LIBCALL if there is none. | ||
Libcall getUINTTOFP(EVT OpVT, EVT RetVT); | ||
|
||
/// getPOWI - Return the POWI_* value for the given types, or | ||
/// UNKNOWN_LIBCALL if there is none. | ||
Libcall getPOWI(EVT RetVT); | ||
|
||
/// getLDEXP - Return the LDEXP_* value for the given types, or | ||
/// UNKNOWN_LIBCALL if there is none. | ||
Libcall getLDEXP(EVT RetVT); | ||
|
||
/// getFREXP - Return the FREXP_* value for the given types, or | ||
/// UNKNOWN_LIBCALL if there is none. | ||
Libcall getFREXP(EVT RetVT); | ||
|
||
/// Return the SYNC_FETCH_AND_* value for the given opcode and type, or | ||
/// UNKNOWN_LIBCALL if there is none. | ||
Libcall getSYNC(unsigned Opc, MVT VT); | ||
|
||
/// Return the outline atomics value for the given atomic ordering, access | ||
/// size and set of libcalls for a given atomic, or UNKNOWN_LIBCALL if there | ||
/// is none. | ||
Libcall getOutlineAtomicHelper(const Libcall (&LC)[5][4], AtomicOrdering Order, | ||
uint64_t MemSize); | ||
|
||
/// Return the outline atomics value for the given opcode, atomic ordering | ||
/// and type, or UNKNOWN_LIBCALL if there is none. | ||
Libcall getOUTLINE_ATOMIC(unsigned Opc, AtomicOrdering Order, MVT VT); | ||
|
||
/// getMEMCPY_ELEMENT_UNORDERED_ATOMIC - Return | ||
/// MEMCPY_ELEMENT_UNORDERED_ATOMIC_* value for the given element size or | ||
/// UNKNOW_LIBCALL if there is none. | ||
Libcall getMEMCPY_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize); | ||
|
||
/// getMEMMOVE_ELEMENT_UNORDERED_ATOMIC - Return | ||
/// MEMMOVE_ELEMENT_UNORDERED_ATOMIC_* value for the given element size or | ||
/// UNKNOW_LIBCALL if there is none. | ||
Libcall getMEMMOVE_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize); | ||
|
||
/// getMEMSET_ELEMENT_UNORDERED_ATOMIC - Return | ||
/// MEMSET_ELEMENT_UNORDERED_ATOMIC_* value for the given element size or | ||
/// UNKNOW_LIBCALL if there is none. | ||
Libcall getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize); | ||
|
||
} // namespace RTLIB | ||
} // namespace llvm | ||
|
||
#endif |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.