aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-jitlink
AgeCommit message (Collapse)AuthorFilesLines
2024-02-20[llvm-jitlink] Use '@' rather than ':' for separator in -sectcreate.Lang Hames1-2/+2
This should avoid the issue with Windows paths that have caused failures on some builders.
2024-02-20[ORC] Add SectCreateMaterializationUnit, llvm-jitlink -sectcreate option.Lang Hames1-0/+61
The SectCreateMaterializationUnit creates a LinkGraph with a single named section containing a single named block whose content is given by a MemoryBuffer. It is intended to support emulation of ld64's -sectcreate option.
2024-01-30[llvm-jitlink] Fix detectStubKind() for big endian systems (#79970)Stefan Gränitz1-4/+5
This function is used in `jitlink-check` lines in LIT tests. In #78371 I missed to swap initial instruction bytes for systems that store the constants as big-endian.
2024-01-23[llvm-jitlink-executor] Fix unused function warning with ↵Stefan Gränitz1-0/+4
LLVM_ENABLE_THREADS=0 (NFC)
2024-01-23[JITLink][AArch32] Multi-stub support for armv7/thumbv7 (#78371)Stefan Gränitz1-1/+45
We want to emit stubs that match the instruction set state of the relocation site. This is important for branches that have no built-in switch for the instruction set state. It's the case for Jump24 relocations. Relocations on instructions that support switching on the fly will be rewritten in a relaxation step in the future. This affects Call relocations on `BL`/`BLX` instructions. In this patch, the StubManager gains a second stub symbol slot for each target and selects which one to use based on the relocation type. For testing, we select the appropriate slot with a stub-kind filter, i.e. `arm` or `thumb`. With that we can implement Armv7 stubs and test that we can have both kinds of stubs for a single external symbol.
2024-01-22[llvm-jitlink] Use SmallVectorImpl when referencing StubInfos (NFC)Nikita Popov1-2/+2
The element type is declared as SmallVector<T, 1>, but we assign to SmallVector<T> &. These types are not the same on 32-bit systems, resulting in a compilation error. Fix this by using SmallVectorImpl<T> & instead, which is independent of the small size.
2024-01-20[llvm-jitlink] Allow optional stub-kind filter in stub_addr() expressions ↵Stefan Gränitz3-12/+83
(#78369) We use `jitlink-check` lines in LIT tests as the primary tool for testing JITLink backends. Parsing and evaluation of the expressions is implemented in `RuntimeDyldChecker`. The `stub_addr(obj, name)` expression allows to obtain the linker-generated stub for the external symbol `name` in object file `obj`. This patch adds support for a filter parameter to select one out of many stubs. This is necessary for the AArch32 JITLink backend, which must be able to emit two different kinds of stubs depending on the instruction set state (Arm/Thumb) of the relocation site. Since the new parameter is optional, we don't have to update existing tests. Filters are regular expressions without brackets that match exactly one existing stub. Given object file `armv7.o` with two stubs for external function `ext` of kinds `armv7_abs_le` and `thumbv7_abs_le`, we get the following filter results e.g.: ``` stub_addr(armv7.o, ext, thumb) thumbv7_abs_le stub_addr(armv7.o, ext, thumbv7) thumbv7_abs_le stub_addr(armv7.o, ext, armv7_abs_le) armv7_abs_le stub_addr(armv7.o, ext, v7_.*_le) Error: "ext" has 2 candidate stubs in file "armv7.o". Please refine stub-kind filter "v7_.*_le" for disambiguation (encountered kinds are "thumbv7_abs_le", "armv7_abs_le"). stub_addr(armv7.o, ext, v8) Error: "ext" has 2 stubs in file "armv7.o", but none of them matches the stub-kind filter "v8" (all encountered kinds are "thumbv7_abs_le", "armv7_abs_le"). ```
2024-01-19[llvm-jitlink] Fix MSVC "not all control paths return a value" warning. NFC.Simon Pilgrim1-0/+1
2024-01-19[llvm-jitlink] Refactor GOT and stubs registration (NFC) (#78365)Stefan Gränitz5-95/+89
Add methods `registerGOTEntry()` and `registerStubEntry()` in `Session::FileInfo` to factor out generic code from the individual object type implementations.
2024-01-14[CMake] Fix building on Haiku and Solaris after ↵Brad Smith2-15/+3
c0d5d36dda04cdd409aabc015da0beb810842fcd (#78084) Haiku and Solaris need some additional libraries after the commit c0d5d36dda04cdd409aabc015da0beb810842fcd Otherwise fails to link a whole bunch of the tools and other binaries with undefined symbols with accept() and connect(). I did a static and dynamic build on illumos and a dynamic build on Haiku. ``` -DLLVM_ENABLE_PROJECTS='clang;clang-tools-extra;lld;mlir' ``` and on illumos ``` -DLLVM_ENABLE_RUNTIMES='openmp' ```
2024-01-03[llvm-jitlink-executor] Drop else block after noreturn-if (NFC) (#76689)Stefan Gränitz1-36/+33
NFC follow-up from https://github.com/llvm/llvm-project/pull/76236
2024-01-03[Orc] Deduplicate GDB JIT Interface declarations (NFC) (#76373)Stefan Gränitz1-30/+3
https://github.com/llvm/llvm-project/pull/76236 introduced the forth copy and it was time to deduplicate. This patch brings it back to 2, one in OrcTargetProcess and one in legacy ExecutionEngine.
2024-01-03[Orc][examples] Revisit advanced LLJIT examples and tests (#76236)Stefan Gränitz1-1/+54
Some maintenance on implementation and tests: * Drop manual TargetMachineBuilder setup * Drop addDebugSupport() in favor of Orc's enableDebuggerSupport() * Check that debug support plugins append jit_code_entry * Update and reduce sample input
2023-12-11[llvm] Use StringRef::{starts,ends}_with (NFC) (#74956)Kazu Hirata1-3/+3
This patch replaces uses of StringRef::{starts,ends}with with StringRef::{starts,ends}_with for consistency with std::{string,string_view}::{starts,ends}_with in C++20. I'm planning to deprecate and eventually remove StringRef::{starts,ends}with.
2023-12-06Re-apply "[llvm-jitlink] Add Process and Platform JITDylibs, ..." with fixes.Lang Hames2-64/+159
This reapplies 3d0dd1a7d6, which was reverted in df2485b215a due to bot failures. This patch addresses the issues seen on the bots by disabling two Linux atexit tests in the ORC runtime whose behavior could not be maintained now that the ORC runtime is being loaded into a separate Platform JITDylib. https://github.com/llvm/llvm-project/issues/74641 has been filed to fix the issue with atexit.
2023-12-05Revert "[llvm-jitlink] Add Process and Platform JITDylibs, generalize alias..."Lang Hames2-159/+64
This reverts commit 3d0dd1a7d62 while I investigate bot failures (e.g. https://lab.llvm.org/buildbot/#/builders/272/builds/2573)
2023-12-05[llvm-jitlink] Add Process and Platform JITDylibs, generalize alias option.Lang Hames2-64/+159
The Process JITDylib holds reflected process symbols. The Platform JITDylib holds ORC runtime symbols if the ORC runtime is loaded. The Platform and Process JITDylibs are appended to the link order of all other JITDylibs, including the main JITDylib, after any explicitly specified libraries. This scheme is similar to the one introduced in LLJIT in 371cb1af61d, and makes it easier to introduce aliases for process and platform symbols in a way that affects all JITDylibs uniformly. Since the Process and Platform JITDylibs are created implicitly the -alias option is generalized to allow source and destination JITDylibs to be explicitly specified, i.e. the -alias option now supports general re-exports. Testcases are updated to account for the change.
2023-12-03[llvm] Stop including vector (NFC)Kazu Hirata1-2/+0
Identified with clangd.
2023-12-02[llvm] Stop including list (NFC)Kazu Hirata1-1/+0
Identified with clangd.
2023-11-24[llvm-jitlink] Support plain AArch32 stubs in jitlink-check's stub_addr() ↵Stefan Gränitz1-0/+26
expressions (#73268) We want to use regular `stub_addr()` expressions in `jitlink-check` lines to test the generation of stubs in AArch32, but we don't want this to require a standardized GOT-based PLT implementation. In terms of performance and binary size it doesn't seem beneficial. And in terms of patching branch targets, we should be able to handle range-extension- and interworking-stubs without a lot of extra logic. In order to allow such AArch32 stubs we add a separate path for `stub_addr()` expressions in `llvm-jitlink-elf`. The relocations in our stubs are not pointing to the GOT, but to the external symbol directly. Thus, we have to avoid access to the block of the edge target. Instead we only return the symbol name, which is enough to use `stub_addr()` expressions in tests. The name of the AArch32 stubs section differs from the conventional `$__STUBS` on purpose. It allows to add a regular PLT/GOT implementation as an orthogonal feature in the future. In order to also allow decoding of stub target addresses in the future, we mention the stub flavor in the section name as well.
2023-11-24[llvm-jitlink] Avoid assertion failure in make_error parameterStefan Gränitz1-1/+5
If GOTSym is not defined, we cannot call `GOTSym.getBlock()`. It failed with: ``` Assertion failed: (Base->isDefined() && "Not a defined symbol"), function getBlock, file JITLink.h, line 554. ```
2023-10-12Use llvm::endianness::{big,little,native} (NFC)Kazu Hirata1-1/+2
Note that llvm::support::endianness has been renamed to llvm::endianness while becoming an enum class as opposed to an enum. This patch replaces support::{big,little,native} with llvm::endianness::{big,little,native}.
2023-09-28Re-apply "[ORC] Add N_SO and N_OSO stabs entries to MachO debug..." with fixes.Lang Hames1-1/+1
This re-applies db51e572893, which was reverted in 05b1a2cb3e6 due to bot failures. The DebuggerSupportPlugin now depends on DWARF, so it has been moved to the new OrcDebugging library (as has the enableDebuggerSupport API).
2023-09-28[ORC] Add DWARFContext generation from LinkGraphs, use in perf support.Prem Chintalapudi2-3/+7
This patch adds line numbers to perf jitdump records emitted by the PerfSupportPlugin, by parsing and using a DWARFContext from preserved debug sections. To avoid making the OrcJIT library depend on DebugInfoDWARF this patch introduces a new OrcDebugging library. Reviewed By: lhames Differential Revision: https://reviews.llvm.org/D146391
2023-09-28[ORC] Rename MemLifetimePolicy to MemLifetime.Lang Hames1-1/+1
The *Policy suffix came from the earlier MemAllocPolicy type, where it was included to distinguish the type from a memory-allocation operation. MemLifetime is a noun already, so the *Policy suffix is just dead weight now.
2023-09-18[ORC][JITLink] Non-debuginfo JITLink perf jitdump support.Prem Chintalapudi1-4/+19
This patch ports PerfJITEventListener to a JITLink plugin, but adds unwind record support and drops debuginfo support temporarily. Debuginfo can be enabled in the future by providing a way to obtain a DWARFContext from a LinkGraph. Reviewed By: lhames Differential Revision: https://reviews.llvm.org/D146169
2023-09-09[jitlink][rtdyld][checker] Re-apply 4b17c81d5a5 with fixes.Eymen Ünay4-21/+28
This re-applies 4b17c81d5a5, "[jitlink/rtdydl][checker] Add TargetFlag dependent disassembler switching support", which was reverted in 4871a9ca546 due to bot failures. The patch has been updated to add missing plumbing for Subtarget Features and a CPU string, which should fix the failing tests. https://reviews.llvm.org/D158280
2023-09-08Revert "[jitlink/rtdydl][checker] Add TargetFlag dependent disassembler ↵Tom Weaver4-28/+21
switching support" This reverts commit 4b17c81d5a5d3e0f514026c2b7f9b623d901cc04. Caused buildbot failures: https://lab.llvm.org/buildbot/#/builders/230/builds/18341 https://lab.llvm.org/buildbot/#/builders/109/builds/73169 https://lab.llvm.org/buildbot/#/builders/67/builds/12597
2023-09-08[jitlink/rtdydl][checker] Add TargetFlag dependent disassembler switching ↵Eymen Ünay4-21/+28
support Some targets such as AArch32 make use of TargetFlags to indicate ISA mode. Depending on the TargetFlag, MCDisassembler and similar target specific objects should be reinitialized with the correct Target Triple. Backends with similar needs can easily extend this implementation for their usecase. The drivers llvm-rtdyld and llvm-jitlink have their SymbolInfo's extended to take TargetFlag into account. RuntimeDyldChecker can now create necessary TargetInfo to reinitialize MCDisassembler and MCInstPrinter. The required triple is obtained from the new getTripleFromTargetFlag function by checking the TargetFlag. In addition, breaking changes for RuntimeDyld COFF Thumb tests are fixed by making the backend emit a TargetFlag. Reviewed By: lhames, sgraenitz Differential Revision: https://reviews.llvm.org/D158280
2023-07-24[llvm-jitlink] Don't return immediately in -noexec mode, just skip execution.Lang Hames1-4/+1
Skipping execution rather than bailing out early means that: 1. Explicit teardown of JIT'd code will happen at the same point (via the call to ExecutionSession::endSession) regardless of whether -noexec is used. 2. The -show-times option will work with -noexec.
2023-07-24[llvm-jitlink] Move statistics code into a separate file.Lang Hames4-118/+140
Further isolates statistics gathering / reporting code from the rest of llvm-jitlink.
2023-07-19[llvm-jitlink] Generalize statistics gathering / reporting.Lang Hames2-37/+114
Moves the llvm-jitlink tool statistics out of the Session struct and into a new LLVMJITLinkStatistics class. Also removes the `-show-sizes` option. Each statistic added will now have its own option. The two previous stats (total size of all blocks before pruning and after fixups) are now available as -pre-prune-total-block-size and -post-fixup-total-block-size. This change should make it easier to add new statistics.
2023-06-26Move SubtargetFeature.h from MC to TargetParserJob Noorman1-1/+1
SubtargetFeature.h is currently part of MC while it doesn't depend on anything in MC. Since some LLVM components might have the need to work with target features without necessarily needing MC, it might be worthwhile to move SubtargetFeature.h to a different location. This will reduce the dependencies of said components. Note that I choose TargetParser as the destination because that's where Triple lives and SubtargetFeatures feels related to that. This issues came up during a JITLink review (D149522). JITLink would like to avoid a dependency on MC while still needing to store target features. Reviewed By: MaskRay, arsenm Differential Revision: https://reviews.llvm.org/D150549
2023-05-13[llvm-jitlink] Pass object features when creating MCSubtargetInfoJob Noorman2-12/+23
The reason for this patch is to allow the MCDisassembler used in tests to disassemble instructions that are only available when a specific feature is enabled. For example, on RISC-V it's currently not possible to use decode_operand() on a compressed instruction. This patch fixes this. Reviewed By: lhames Differential Revision: https://reviews.llvm.org/D149523
2023-05-12[llvm] Migrate {starts,ends}with_insensitive to ↵Kazu Hirata1-5/+5
{starts,ends}_with_insensitive (NFC) This patch migrates uses of StringRef::{starts,ends}with_insensitive to StringRef::{starts,ends}_with_insensitive so that we can use names similar to those used in std::string_view. I'm planning to deprecate StringRef::{starts,ends}with_insensitive once the migration is complete across the code base. Differential Revision: https://reviews.llvm.org/D150426
2023-04-18Revert "Non-debuginfo JITLink perf jitdump support"Valentin Churavy1-19/+4
This reverts commit 76e1521b0acff739c0425d0fcbb9360fc17f1af8.
2023-04-18Non-debuginfo JITLink perf jitdump supportPrem Chintalapudi1-4/+19
This patch ports PerfJITEventListener to a JITLink plugin, but adds unwind record support and drops debuginfo support temporarily. Debuginfo can be enabled in the future by providing a way to obtain a DWARFContext from a LinkGraph. See D146060 for an experimental implementation that adds debuginfo parsing. Reviewed By: lhames Differential Revision: https://reviews.llvm.org/D146169
2023-04-17[JITLink][ELF][x86-64] Add support for R_X86_64_GOTPC32 relocation.Lang Hames1-0/+5
Adds support for the R_X86_64_GOTPC32 relocation, which is a 32-bit delta to the global offset table. Since the delta to the GOT doesn't actually require any GOT entries to exist this commit adds an extra fallback path to the getOrCreateGOTSymbol function: If the symbol is in the extenal symbols list but no entry exists then the symbol is turned into an absolute symbol pointing to an arbitrary address in the current graph's allocation (accessing this address via the symbol would be illegal, but any access should have triggered creation of a GOT entry which would prevent this fallback path from being taken in the first place). This commit also updates the llvm-jitlink tool to scrape the addresses of the absolute symbols in the graph so that the testcase can see the now-absolute _GLOBAL_OFFSET_TABLE_ symbol.
2023-04-03[Orc] Add AutoRegisterCode option for DebugObjectManagerPluginStefan Gränitz1-1/+1
Configure the plugin to automatically call the debugger rendezvous breakpoint `__jit_debug_register_code()` for every translation unit (enabled) or never at all (disabled). Default API and behavior remain unchanged. If AutoRegisterCode is turned off, it's the client's own responsibility to call the rendezvous breakpoint function at an appropriate time. Depending on the complexity of the debugger's rendezvous breakpoint implementation, this can provide significant performance improvements in cases where many debug objects are added in sequence. Reviewed By: lhames Differential Revision: https://reviews.llvm.org/D147310
2023-03-27[ORC] Move most ORC APIs to ExecutorAddr, introduce ExecutorSymbolDef.Lang Hames1-9/+9
ExecutorAddr was introduced in b8e5f918166 as an eventual replacement for JITTargetAddress. ExecutorSymbolDef is introduced in this patch as a replacement for JITEvaluatedSymbol: ExecutorSymbolDef is an (ExecutorAddr, JITSymbolFlags) pair, where JITEvaluatedSymbol was a (JITTargetAddress, JITSymbolFlags) pair. A number of APIs had already migrated from JITTargetAddress to ExecutorAddr, but many of ORC's internals were still using the older type. This patch aims to address that. Some public APIs are affected as well. If you need to migrate your APIs you can use the following operations: * ExecutorAddr::toPtr replaces jitTargetAddressToPointer and jitTargetAddressToFunction. * ExecutorAddr::fromPtr replace pointerToJITTargetAddress. * ExecutorAddr(JITTargetAddress) creates an ExecutorAddr value from a JITTargetAddress. * ExecutorAddr::getValue() creates a JITTargetAddress value from an ExecutorAddr. JITTargetAddress and JITEvaluatedSymbol will remain in JITSymbol.h for now, but the aim will be to eventually deprecate and remove these types (probably when MCJIT and RuntimeDyld are deprecated).
2023-03-24[llvm-jitlink] Remove unnecessary header include left in 01bdd8cffca.Lang Hames1-1/+0
2023-03-24[llvm-jitlink] Rename -show-graph option to -show-graphs, make it a regex.Lang Hames2-8/+19
The original -show-graph option dumped the LinkGraph for all graphs loaded into the session, but can make it difficult to see small graphs (e.g. reduced test cases) among the surrounding larger files (especially the ORC runtime). The new -show-graphs option takes a regex and dumps only those graphs matching the regex. This allows testcases to specify exactly which graphs to dump.
2023-03-20[llvm-jitlink] Fix typo in description of llvm-jitlink's -alias option.Lang Hames1-1/+2
2023-03-18Re-apply "[JITLink][ORC] Rename MemDeallocPolicy to MemLifetime..." with fixes.Lang Hames1-2/+1
This reapplies 2cc64df0bd6a802eab592dbc282463c3e4a4281c, which was reverted in 5379c46d490640bfa80283e00240b6f1006092b4 due to bot failures. The new patch contains fixes to ELFLinkGraphBuilder.h to better handle non-SHT_ALLOC sections (these were being accidentally skipped in the previous patch), and to skip SHT_NULL sections.
2023-03-17Revert "[JITLink][ORC] Rename MemDeallocPolicy to MemLifetimePolicy, add ..."Lang Hames1-1/+2
This reverts commit 2cc64df0bd6a802eab592dbc282463c3e4a4281c while I investigate bot failures (e.g. https://lab.llvm.org/buildbot/#/builders/3/builds/23081).
2023-03-17[JITLink][ORC] Rename MemDeallocPolicy to MemLifetimePolicy, add NoAlloc option.Lang Hames1-2/+1
The original MemDeallocPolicy had two options: * Standard: allocated memory lives until deallocated or abandoned. * Finalize: allocated memory lives until all finalize actions have been run, then is destroyed. This patch introduces a new 'NoAlloc' option. NoAlloc indicates that the section should be ignored by the JITLinkMemoryManager -- the memory manager should allocate neither working memory nor executor address space to blocks in NoAlloc sections. The NoAlloc option is intended to support metadata sections (e.g. debug info) that we want to keep in the graph and have fixed up if necessary, but don't want allocated or transmitted to the executor (or we want that allocation and transmission to be managed manually by plugins). Since NoAlloc blocks are ignored by the JITLinkMemoryManager they will not have working memory allocated to them by default post-allocation. Clients wishing to modify the content of a block in a NoAlloc section should call `Block::getMutableMemory(LinkGraph&)` to get writable memory allocated on the LinkGraph's allocator (this memory will exist for the lifetime of the graph). If no client requests mutable memory prior to the fixup phase then the generic link algorithm will do so when it encounters the first edge in any given block. Addresses of blocks in NoAlloc sections are initialized by the LinkGraph creator (a LinkGraphBuilder, if the graph is generated from an object file), and should not be modified by the JITLinkMemoryManager. Plugins are responsible for updating addresses if they add/remove content from these sections. The meaning of addresses in NoAlloc-sections is backend/plugin defined, but for fixup purposes they will be treated the same as addresses in Standard/Finalize sections. References from Standard/Finalize sections to NoAlloc sections are expected to be common (these represent metadata tracking executor addresses). References from NoAlloc sections to Standard/Finalize sections are expected to be rare/non-existent (they would represent JIT'd code / data tracking metadata in the controller, which would be surprising). LinkGraphBuilders and specific backends may impose additional constraints on edges between Standard/Finalize and NoAlloc sections where required for correctness. Differential Revision: https://reviews.llvm.org/D146183
2023-03-01[ORC] Drop StaticLibraryDefinitionGenerator Load/Create overloads with triples.Lang Hames1-2/+1
We can get the triple from the ExecutionSession, so clients shouldn't have to provide it.
2023-02-21[ORC] Add an ExecutionSession::getTargetTriple convenience function.Lang Hames1-15/+10
Forwards to ExecutorProcessControl::getTargetTriple, and saves clients the trouble of spelling 'getExecutorProcessControl()' everywhere.
2023-02-17[llvm-jitlink] Discard allocation actions in -noexec mode.Lang Hames1-2/+4
Allocation actions may run JIT'd code, which isn't permitted in -noexec mode. Testcases that depend on actions running should be moved to the ORC runtime.
2023-02-07[NFC][TargetParser] Remove llvm/ADT/Triple.hArchibald Elliott1-1/+1
I also ran `git clang-format` to get the headers in the right order for the new location, which has changed the order of other headers in two files.