[llvm] r358869 - [JITLink] Remove a lot of reduntant 'JITLink_' prefixes. NFC.
Lang Hames via llvm-commits
llvm-commits at lists.llvm.org
Sun Apr 21 20:03:10 PDT 2019
Author: lhames
Date: Sun Apr 21 20:03:09 2019
New Revision: 358869
URL: http://llvm.org/viewvc/llvm-project?rev=358869&view=rev
Log:
[JITLink] Remove a lot of reduntant 'JITLink_' prefixes. NFC.
Added:
llvm/trunk/include/llvm/ExecutionEngine/JITLink/EHFrameSupport.h
- copied, changed from r358865, llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_EHFrameSupport.h
llvm/trunk/include/llvm/ExecutionEngine/JITLink/MachO.h
- copied, changed from r358865, llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_MachO.h
llvm/trunk/include/llvm/ExecutionEngine/JITLink/MachO_x86_64.h
- copied, changed from r358865, llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_MachO_x86_64.h
llvm/trunk/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp
- copied, changed from r358865, llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_EHFrameSupport.cpp
llvm/trunk/lib/ExecutionEngine/JITLink/EHFrameSupportImpl.h
- copied, changed from r358865, llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_EHFrameSupportImpl.h
llvm/trunk/lib/ExecutionEngine/JITLink/MachO.cpp
- copied, changed from r358865, llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_MachO.cpp
llvm/trunk/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp
- copied, changed from r358865, llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_MachO_x86_64.cpp
llvm/trunk/unittests/ExecutionEngine/JITLink/MachO_x86_64_Tests.cpp
- copied, changed from r358865, llvm/trunk/unittests/ExecutionEngine/JITLink/JITLinkTest_MachO_x86_64_Tests.cpp
Removed:
llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_EHFrameSupport.h
llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_MachO.h
llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_MachO_x86_64.h
llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_EHFrameSupport.cpp
llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_EHFrameSupportImpl.h
llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_MachO.cpp
llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_MachO_x86_64.cpp
llvm/trunk/unittests/ExecutionEngine/JITLink/JITLinkTest_MachO_x86_64_Tests.cpp
Modified:
llvm/trunk/lib/ExecutionEngine/JITLink/CMakeLists.txt
llvm/trunk/lib/ExecutionEngine/JITLink/JITLink.cpp
llvm/trunk/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp
llvm/trunk/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
llvm/trunk/unittests/ExecutionEngine/JITLink/CMakeLists.txt
Copied: llvm/trunk/include/llvm/ExecutionEngine/JITLink/EHFrameSupport.h (from r358865, llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_EHFrameSupport.h)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITLink/EHFrameSupport.h?p2=llvm/trunk/include/llvm/ExecutionEngine/JITLink/EHFrameSupport.h&p1=llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_EHFrameSupport.h&r1=358865&r2=358869&rev=358869&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_EHFrameSupport.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/JITLink/EHFrameSupport.h Sun Apr 21 20:03:09 2019
@@ -1,4 +1,4 @@
-//===----- JITLink_EHFrameSupport.h - JITLink eh-frame utils ----*- C++ -*-===//
+//===--------- EHFrameSupport.h - JITLink eh-frame utils --------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -10,8 +10,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_EXECUTIONENGINE_JITLINK_JITLINK_EHFRAMESUPPORT_H
-#define LLVM_EXECUTIONENGINE_JITLINK_JITLINK_EHFRAMESUPPORT_H
+#ifndef LLVM_EXECUTIONENGINE_JITLINK_EHFRAMESUPPORT_H
+#define LLVM_EXECUTIONENGINE_JITLINK_EHFRAMESUPPORT_H
#include "llvm/ADT/Triple.h"
#include "llvm/ExecutionEngine/JITLink/JITLink.h"
@@ -39,4 +39,4 @@ AtomGraphPassFunction createEHFrameRecor
} // end namespace jitlink
} // end namespace llvm
-#endif // LLVM_EXECUTIONENGINE_JITLINK_JITLINK_EHFRAMESUPPORT_H
+#endif // LLVM_EXECUTIONENGINE_JITLINK_EHFRAMESUPPORT_H
Removed: llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_EHFrameSupport.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_EHFrameSupport.h?rev=358868&view=auto
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_EHFrameSupport.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_EHFrameSupport.h (removed)
@@ -1,42 +0,0 @@
-//===----- JITLink_EHFrameSupport.h - JITLink eh-frame utils ----*- 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
-//
-//===----------------------------------------------------------------------===//
-//
-// EHFrame registration support for JITLink.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_EXECUTIONENGINE_JITLINK_JITLINK_EHFRAMESUPPORT_H
-#define LLVM_EXECUTIONENGINE_JITLINK_JITLINK_EHFRAMESUPPORT_H
-
-#include "llvm/ADT/Triple.h"
-#include "llvm/ExecutionEngine/JITLink/JITLink.h"
-#include "llvm/ExecutionEngine/JITSymbol.h"
-#include "llvm/Support/Error.h"
-
-namespace llvm {
-namespace jitlink {
-
-/// Registers all FDEs in the given eh-frame section with the current process.
-Error registerEHFrameSection(const void *EHFrameSectionAddr);
-
-/// Deregisters all FDEs in the given eh-frame section with the current process.
-Error deregisterEHFrameSection(const void *EHFrameSectionAddr);
-
-/// Creates a pass that records the address of the EH frame section. If no
-/// eh-frame section is found, it will set EHFrameAddr to zero.
-///
-/// Authors of JITLinkContexts can use this function to register a post-fixup
-/// pass that records the address of the eh-frame section. This address can
-/// be used after finalization to register and deregister the frame.
-AtomGraphPassFunction createEHFrameRecorderPass(const Triple &TT,
- JITTargetAddress &EHFrameAddr);
-
-} // end namespace jitlink
-} // end namespace llvm
-
-#endif // LLVM_EXECUTIONENGINE_JITLINK_JITLINK_EHFRAMESUPPORT_H
Removed: llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_MachO.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_MachO.h?rev=358868&view=auto
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_MachO.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_MachO.h (removed)
@@ -1,30 +0,0 @@
-//===--- JITLink_MachO.h - Generic JIT link function for MachO --*- 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
-//
-//===----------------------------------------------------------------------===//
-//
-// Generic jit-link functions for MachO.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_EXECUTIONENGINE_JITLINK_JITLINK_MACHO_H
-#define LLVM_EXECUTIONENGINE_JITLINK_JITLINK_MACHO_H
-
-#include "llvm/ExecutionEngine/JITLink/JITLink.h"
-
-namespace llvm {
-namespace jitlink {
-
-/// jit-link the given ObjBuffer, which must be a MachO object file.
-///
-/// Uses conservative defaults for GOT and stub handling based on the target
-/// platform.
-void jitLink_MachO(std::unique_ptr<JITLinkContext> Ctx);
-
-} // end namespace jitlink
-} // end namespace llvm
-
-#endif // LLVM_EXECUTIONENGINE_JITLINK_JITLINK_MACHO_X86_64_H
Removed: llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_MachO_x86_64.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_MachO_x86_64.h?rev=358868&view=auto
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_MachO_x86_64.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_MachO_x86_64.h (removed)
@@ -1,63 +0,0 @@
-//===--- JITLink_MachO_x86_64.h - JIT link functions for MachO --*- 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
-//
-//===----------------------------------------------------------------------===//
-//
-// jit-link functions for MachO/x86-64.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_EXECUTIONENGINE_JITLINK_JITLINK_MACHO_X86_64_H
-#define LLVM_EXECUTIONENGINE_JITLINK_JITLINK_MACHO_X86_64_H
-
-#include "llvm/ExecutionEngine/JITLink/JITLink.h"
-
-namespace llvm {
-namespace jitlink {
-
-namespace MachO_x86_64_Edges {
-
-enum MachOX86RelocationKind : Edge::Kind {
- Branch32 = Edge::FirstRelocation,
- Pointer64,
- Pointer64Anon,
- PCRel32,
- PCRel32Minus1,
- PCRel32Minus2,
- PCRel32Minus4,
- PCRel32Anon,
- PCRel32Minus1Anon,
- PCRel32Minus2Anon,
- PCRel32Minus4Anon,
- PCRel32GOTLoad,
- PCRel32GOT,
- PCRel32TLV,
- Delta32,
- Delta64,
- NegDelta32,
- NegDelta64,
-};
-
-} // namespace MachO_x86_64_Edges
-
-/// jit-link the given object buffer, which must be a MachO x86-64 object file.
-///
-/// If PrePrunePasses is empty then a default mark-live pass will be inserted
-/// that will mark all exported atoms live. If PrePrunePasses is not empty, the
-/// caller is responsible for including a pass to mark atoms as live.
-///
-/// If PostPrunePasses is empty then a default GOT-and-stubs insertion pass will
-/// be inserted. If PostPrunePasses is not empty then the caller is responsible
-/// for including a pass to insert GOT and stub edges.
-void jitLink_MachO_x86_64(std::unique_ptr<JITLinkContext> Ctx);
-
-/// Return the string name of the given MachO x86-64 edge kind.
-StringRef getMachOX86RelocationKindName(Edge::Kind R);
-
-} // end namespace jitlink
-} // end namespace llvm
-
-#endif // LLVM_EXECUTIONENGINE_JITLINK_JITLINK_MACHO_X86_64_H
Copied: llvm/trunk/include/llvm/ExecutionEngine/JITLink/MachO.h (from r358865, llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_MachO.h)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITLink/MachO.h?p2=llvm/trunk/include/llvm/ExecutionEngine/JITLink/MachO.h&p1=llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_MachO.h&r1=358865&r2=358869&rev=358869&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_MachO.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/JITLink/MachO.h Sun Apr 21 20:03:09 2019
@@ -1,4 +1,4 @@
-//===--- JITLink_MachO.h - Generic JIT link function for MachO --*- C++ -*-===//
+//===------- MachO.h - Generic JIT link function for MachO ------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -10,8 +10,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_EXECUTIONENGINE_JITLINK_JITLINK_MACHO_H
-#define LLVM_EXECUTIONENGINE_JITLINK_JITLINK_MACHO_H
+#ifndef LLVM_EXECUTIONENGINE_JITLINK_MACHO_H
+#define LLVM_EXECUTIONENGINE_JITLINK_MACHO_H
#include "llvm/ExecutionEngine/JITLink/JITLink.h"
@@ -27,4 +27,4 @@ void jitLink_MachO(std::unique_ptr<JITLi
} // end namespace jitlink
} // end namespace llvm
-#endif // LLVM_EXECUTIONENGINE_JITLINK_JITLINK_MACHO_X86_64_H
+#endif // LLVM_EXECUTIONENGINE_JITLINK_MACHO_H
Copied: llvm/trunk/include/llvm/ExecutionEngine/JITLink/MachO_x86_64.h (from r358865, llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_MachO_x86_64.h)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITLink/MachO_x86_64.h?p2=llvm/trunk/include/llvm/ExecutionEngine/JITLink/MachO_x86_64.h&p1=llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_MachO_x86_64.h&r1=358865&r2=358869&rev=358869&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/JITLink/JITLink_MachO_x86_64.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/JITLink/MachO_x86_64.h Sun Apr 21 20:03:09 2019
@@ -1,4 +1,4 @@
-//===--- JITLink_MachO_x86_64.h - JIT link functions for MachO --*- C++ -*-===//
+//===--- MachO_x86_64.h - JIT link functions for MachO/x86-64 ---*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -10,8 +10,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_EXECUTIONENGINE_JITLINK_JITLINK_MACHO_X86_64_H
-#define LLVM_EXECUTIONENGINE_JITLINK_JITLINK_MACHO_X86_64_H
+#ifndef LLVM_EXECUTIONENGINE_JITLINK_MACHO_X86_64_H
+#define LLVM_EXECUTIONENGINE_JITLINK_MACHO_X86_64_H
#include "llvm/ExecutionEngine/JITLink/JITLink.h"
@@ -60,4 +60,4 @@ StringRef getMachOX86RelocationKindName(
} // end namespace jitlink
} // end namespace llvm
-#endif // LLVM_EXECUTIONENGINE_JITLINK_JITLINK_MACHO_X86_64_H
+#endif // LLVM_EXECUTIONENGINE_JITLINK_MACHO_X86_64_H
Modified: llvm/trunk/lib/ExecutionEngine/JITLink/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JITLink/CMakeLists.txt?rev=358869&r1=358868&r2=358869&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/JITLink/CMakeLists.txt (original)
+++ llvm/trunk/lib/ExecutionEngine/JITLink/CMakeLists.txt Sun Apr 21 20:03:09 2019
@@ -1,9 +1,9 @@
add_llvm_library(LLVMJITLink
JITLink.cpp
JITLinkGeneric.cpp
- JITLink_EHFrameSupport.cpp
- JITLink_MachO.cpp
- JITLink_MachO_x86_64.cpp
+ EHFrameSupport.cpp
+ MachO.cpp
+ MachO_x86_64.cpp
MachOAtomGraphBuilder.cpp
DEPENDS
Copied: llvm/trunk/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp (from r358865, llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_EHFrameSupport.cpp)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp?p2=llvm/trunk/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp&p1=llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_EHFrameSupport.cpp&r1=358865&r2=358869&rev=358869&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_EHFrameSupport.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp Sun Apr 21 20:03:09 2019
@@ -7,7 +7,7 @@
//
//===----------------------------------------------------------------------===//
-#include "JITLink_EHFrameSupportImpl.h"
+#include "EHFrameSupportImpl.h"
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/Support/DynamicLibrary.h"
Copied: llvm/trunk/lib/ExecutionEngine/JITLink/EHFrameSupportImpl.h (from r358865, llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_EHFrameSupportImpl.h)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JITLink/EHFrameSupportImpl.h?p2=llvm/trunk/lib/ExecutionEngine/JITLink/EHFrameSupportImpl.h&p1=llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_EHFrameSupportImpl.h&r1=358865&r2=358869&rev=358869&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_EHFrameSupportImpl.h (original)
+++ llvm/trunk/lib/ExecutionEngine/JITLink/EHFrameSupportImpl.h Sun Apr 21 20:03:09 2019
@@ -1,4 +1,4 @@
-//===----- JITLink_EHFrameSupport.h - JITLink eh-frame utils ----*- C++ -*-===//
+//===------- EHFrameSupportImpl.h - JITLink eh-frame utils ------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -10,10 +10,10 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_LIB_EXECUTIONENGINE_JITLINK_JITLINK_EHFRAMESUPPORTIMPL_H
-#define LLVM_LIB_EXECUTIONENGINE_JITLINK_JITLINK_EHFRAMESUPPORTIMPL_H
+#ifndef LLVM_LIB_EXECUTIONENGINE_JITLINK_EHFRAMESUPPORTIMPL_H
+#define LLVM_LIB_EXECUTIONENGINE_JITLINK_EHFRAMESUPPORTIMPL_H
-#include "llvm/ExecutionEngine/JITLink/JITLink_EHFrameSupport.h"
+#include "llvm/ExecutionEngine/JITLink/EHFrameSupport.h"
#include "llvm/ExecutionEngine/JITLink/JITLink.h"
#include "llvm/Support/BinaryStreamReader.h"
@@ -62,4 +62,4 @@ Error addEHFrame(AtomGraph &G, Section &
} // end namespace jitlink
} // end namespace llvm
-#endif // LLVM_LIB_EXECUTIONENGINE_JITLINK_JITLINK_EHFRAMESUPPORTIMPL_H
+#endif // LLVM_LIB_EXECUTIONENGINE_JITLINK_EHFRAMESUPPORTIMPL_H
Modified: llvm/trunk/lib/ExecutionEngine/JITLink/JITLink.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JITLink/JITLink.cpp?rev=358869&r1=358868&r2=358869&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/JITLink/JITLink.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/JITLink/JITLink.cpp Sun Apr 21 20:03:09 2019
@@ -10,7 +10,7 @@
#include "llvm/ExecutionEngine/JITLink/JITLink.h"
#include "llvm/BinaryFormat/Magic.h"
-#include "llvm/ExecutionEngine/JITLink/JITLink_MachO.h"
+#include "llvm/ExecutionEngine/JITLink/MachO.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/MemoryBuffer.h"
Modified: llvm/trunk/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp?rev=358869&r1=358868&r2=358869&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp Sun Apr 21 20:03:09 2019
@@ -11,7 +11,7 @@
//===----------------------------------------------------------------------===//
#include "JITLinkGeneric.h"
-#include "JITLink_EHFrameSupportImpl.h"
+#include "EHFrameSupportImpl.h"
#include "llvm/Support/BinaryStreamReader.h"
#include "llvm/Support/MemoryBuffer.h"
Removed: llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_EHFrameSupport.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_EHFrameSupport.cpp?rev=358868&view=auto
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_EHFrameSupport.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_EHFrameSupport.cpp (removed)
@@ -1,533 +0,0 @@
-//===-------- JITLink_EHFrameSupport.cpp - JITLink eh-frame utils ---------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "JITLink_EHFrameSupportImpl.h"
-
-#include "llvm/BinaryFormat/Dwarf.h"
-#include "llvm/Support/DynamicLibrary.h"
-
-#define DEBUG_TYPE "jitlink"
-
-namespace llvm {
-namespace jitlink {
-
-EHFrameParser::EHFrameParser(AtomGraph &G, Section &EHFrameSection,
- StringRef EHFrameContent,
- JITTargetAddress EHFrameAddress,
- Edge::Kind FDEToCIERelocKind,
- Edge::Kind FDEToTargetRelocKind)
- : G(G), EHFrameSection(EHFrameSection), EHFrameContent(EHFrameContent),
- EHFrameAddress(EHFrameAddress),
- EHFrameReader(EHFrameContent, G.getEndianness()),
- FDEToCIERelocKind(FDEToCIERelocKind),
- FDEToTargetRelocKind(FDEToTargetRelocKind) {}
-
-Error EHFrameParser::atomize() {
- while (!EHFrameReader.empty()) {
- size_t RecordOffset = EHFrameReader.getOffset();
-
- LLVM_DEBUG({
- dbgs() << "Processing eh-frame record at "
- << format("0x%016" PRIx64, EHFrameAddress + RecordOffset)
- << " (offset " << RecordOffset << ")\n";
- });
-
- size_t CIELength = 0;
- uint32_t CIELengthField;
- if (auto Err = EHFrameReader.readInteger(CIELengthField))
- return Err;
-
- // Process CIE length/extended-length fields to build the atom.
- //
- // The value of these fields describe the length of the *rest* of the CIE
- // (not including data up to the end of the field itself) so we have to
- // bump CIELength to include the data up to the end of the field: 4 bytes
- // for Length, or 12 bytes (4 bytes + 8 bytes) for ExtendedLength.
- if (CIELengthField == 0) // Length 0 means end of __eh_frame section.
- break;
-
- // If the regular length field's value is 0xffffffff, use extended length.
- if (CIELengthField == 0xffffffff) {
- uint64_t CIEExtendedLengthField;
- if (auto Err = EHFrameReader.readInteger(CIEExtendedLengthField))
- return Err;
- if (CIEExtendedLengthField > EHFrameReader.bytesRemaining())
- return make_error<JITLinkError>("CIE record extends past the end of "
- "the __eh_frame section");
- if (CIEExtendedLengthField + 12 > std::numeric_limits<size_t>::max())
- return make_error<JITLinkError>("CIE record too large to process");
- CIELength = CIEExtendedLengthField + 12;
- } else {
- if (CIELengthField > EHFrameReader.bytesRemaining())
- return make_error<JITLinkError>("CIE record extends past the end of "
- "the __eh_frame section");
- CIELength = CIELengthField + 4;
- }
-
- LLVM_DEBUG(dbgs() << " length: " << CIELength << "\n");
-
- // Add an atom for this record.
- CurRecordAtom = &G.addAnonymousAtom(
- EHFrameSection, EHFrameAddress + RecordOffset, G.getPointerSize());
- CurRecordAtom->setContent(EHFrameContent.substr(RecordOffset, CIELength));
-
- // Read the CIE Pointer.
- size_t CIEPointerAddress = EHFrameAddress + EHFrameReader.getOffset();
- uint32_t CIEPointer;
- if (auto Err = EHFrameReader.readInteger(CIEPointer))
- return Err;
-
- // Based on the CIE pointer value, parse this as a CIE or FDE record.
- if (CIEPointer == 0) {
- if (auto Err = processCIE())
- return Err;
- } else {
- if (auto Err = processFDE(CIEPointerAddress, CIEPointer))
- return Err;
- }
-
- EHFrameReader.setOffset(RecordOffset + CIELength);
- }
-
- return Error::success();
-}
-
-Expected<EHFrameParser::AugmentationInfo>
-EHFrameParser::parseAugmentationString() {
- AugmentationInfo AugInfo;
- uint8_t NextChar;
- uint8_t *NextField = &AugInfo.Fields[0];
-
- if (auto Err = EHFrameReader.readInteger(NextChar))
- return std::move(Err);
-
- while (NextChar != 0) {
- switch (NextChar) {
- case 'z':
- AugInfo.AugmentationDataPresent = true;
- break;
- case 'e':
- if (auto Err = EHFrameReader.readInteger(NextChar))
- return std::move(Err);
- if (NextChar != 'h')
- return make_error<JITLinkError>("Unrecognized substring e" +
- Twine(NextChar) +
- " in augmentation string");
- AugInfo.EHDataFieldPresent = true;
- break;
- case 'L':
- case 'P':
- case 'R':
- *NextField++ = NextChar;
- break;
- default:
- return make_error<JITLinkError>("Unrecognized character " +
- Twine(NextChar) +
- " in augmentation string");
- }
-
- if (auto Err = EHFrameReader.readInteger(NextChar))
- return std::move(Err);
- }
-
- return std::move(AugInfo);
-}
-
-Expected<JITTargetAddress> EHFrameParser::readAbsolutePointer() {
- static_assert(sizeof(JITTargetAddress) == sizeof(uint64_t),
- "Result must be able to hold a uint64_t");
- JITTargetAddress Addr;
- if (G.getPointerSize() == 8) {
- if (auto Err = EHFrameReader.readInteger(Addr))
- return std::move(Err);
- } else if (G.getPointerSize() == 4) {
- uint32_t Addr32;
- if (auto Err = EHFrameReader.readInteger(Addr32))
- return std::move(Err);
- Addr = Addr32;
- } else
- llvm_unreachable("Pointer size is not 32-bit or 64-bit");
- return Addr;
-}
-
-Error EHFrameParser::processCIE() {
- // Use the dwarf namespace for convenient access to pointer encoding
- // constants.
- using namespace dwarf;
-
- LLVM_DEBUG(dbgs() << " Record is CIE\n");
-
- /// Reset state for the new CIE.
- LSDAFieldPresent = false;
-
- uint8_t Version = 0;
- if (auto Err = EHFrameReader.readInteger(Version))
- return Err;
-
- if (Version != 0x01)
- return make_error<JITLinkError>("Bad CIE version " + Twine(Version) +
- " (should be 0x01) in eh-frame");
-
- auto AugInfo = parseAugmentationString();
- if (!AugInfo)
- return AugInfo.takeError();
-
- // Skip the EH Data field if present.
- if (AugInfo->EHDataFieldPresent)
- if (auto Err = EHFrameReader.skip(G.getPointerSize()))
- return Err;
-
- // Read and sanity check the code alignment factor.
- {
- uint64_t CodeAlignmentFactor = 0;
- if (auto Err = EHFrameReader.readULEB128(CodeAlignmentFactor))
- return Err;
- if (CodeAlignmentFactor != 1)
- return make_error<JITLinkError>("Unsupported CIE code alignment factor " +
- Twine(CodeAlignmentFactor) +
- " (expected 1)");
- }
-
- // Read and sanity check the data alignment factor.
- {
- int64_t DataAlignmentFactor = 0;
- if (auto Err = EHFrameReader.readSLEB128(DataAlignmentFactor))
- return Err;
- if (DataAlignmentFactor != -8)
- return make_error<JITLinkError>("Unsupported CIE data alignment factor " +
- Twine(DataAlignmentFactor) +
- " (expected -8)");
- }
-
- // Skip the return address register field.
- if (auto Err = EHFrameReader.skip(1))
- return Err;
-
- uint64_t AugmentationDataLength = 0;
- if (auto Err = EHFrameReader.readULEB128(AugmentationDataLength))
- return Err;
-
- uint32_t AugmentationDataStartOffset = EHFrameReader.getOffset();
-
- uint8_t *NextField = &AugInfo->Fields[0];
- while (uint8_t Field = *NextField++) {
- switch (Field) {
- case 'L': {
- LSDAFieldPresent = true;
- uint8_t LSDAPointerEncoding;
- if (auto Err = EHFrameReader.readInteger(LSDAPointerEncoding))
- return Err;
- if (LSDAPointerEncoding != (DW_EH_PE_pcrel | DW_EH_PE_absptr))
- return make_error<JITLinkError>(
- "Unsupported LSDA pointer encoding " +
- formatv("{0:x2}", LSDAPointerEncoding) + " in CIE at " +
- formatv("{0:x16}", CurRecordAtom->getAddress()));
- break;
- }
- case 'P': {
- uint8_t PersonalityPointerEncoding = 0;
- if (auto Err = EHFrameReader.readInteger(PersonalityPointerEncoding))
- return Err;
- if (PersonalityPointerEncoding !=
- (DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4))
- return make_error<JITLinkError>(
- "Unspported personality pointer "
- "encoding " +
- formatv("{0:x2}", PersonalityPointerEncoding) + " in CIE at " +
- formatv("{0:x16}", CurRecordAtom->getAddress()));
- uint32_t PersonalityPointerAddress;
- if (auto Err = EHFrameReader.readInteger(PersonalityPointerAddress))
- return Err;
- break;
- }
- case 'R': {
- uint8_t FDEPointerEncoding;
- if (auto Err = EHFrameReader.readInteger(FDEPointerEncoding))
- return Err;
- if (FDEPointerEncoding != (DW_EH_PE_pcrel | DW_EH_PE_absptr))
- return make_error<JITLinkError>(
- "Unsupported FDE address pointer "
- "encoding " +
- formatv("{0:x2}", FDEPointerEncoding) + " in CIE at " +
- formatv("{0:x16}", CurRecordAtom->getAddress()));
- break;
- }
- default:
- llvm_unreachable("Invalid augmentation string field");
- }
- }
-
- if (EHFrameReader.getOffset() - AugmentationDataStartOffset >
- AugmentationDataLength)
- return make_error<JITLinkError>("Read past the end of the augmentation "
- "data while parsing fields");
-
- return Error::success();
-}
-
-Error EHFrameParser::processFDE(JITTargetAddress CIEPointerAddress,
- uint32_t CIEPointer) {
- LLVM_DEBUG(dbgs() << " Record is FDE\n");
-
- LLVM_DEBUG({
- dbgs() << " CIE pointer: "
- << format("0x%016" PRIx64, CIEPointerAddress - CIEPointer) << "\n";
- });
-
- auto CIEAtom = G.findAtomByAddress(CIEPointerAddress - CIEPointer);
- if (!CIEAtom)
- return CIEAtom.takeError();
-
- // The CIEPointer looks good. Add a relocation.
- CurRecordAtom->addEdge(FDEToCIERelocKind,
- CIEPointerAddress - CurRecordAtom->getAddress(),
- *CIEAtom, 0);
-
- // Read and sanity check the PC-start pointer and size.
- JITTargetAddress PCBeginAddress = EHFrameAddress + EHFrameReader.getOffset();
-
- auto PCBeginDelta = readAbsolutePointer();
- if (!PCBeginDelta)
- return PCBeginDelta.takeError();
-
- JITTargetAddress PCBegin = PCBeginAddress + *PCBeginDelta;
- LLVM_DEBUG({
- dbgs() << " PC begin: " << format("0x%016" PRIx64, PCBegin) << "\n";
- });
-
- auto *TargetAtom = G.getAtomByAddress(PCBegin);
-
- if (!TargetAtom)
- return make_error<JITLinkError>("FDE PC-begin " +
- formatv("{0:x16}", PCBegin) +
- " does not point at atom");
-
- if (TargetAtom->getAddress() != PCBegin)
- return make_error<JITLinkError>(
- "FDE PC-begin " + formatv("{0:x16}", PCBegin) +
- " does not point to start of atom at " +
- formatv("{0:x16}", TargetAtom->getAddress()));
-
- LLVM_DEBUG(dbgs() << " FDE target: " << *TargetAtom << "\n");
-
- // The PC-start pointer and size look good. Add relocations.
- CurRecordAtom->addEdge(FDEToTargetRelocKind,
- PCBeginAddress - CurRecordAtom->getAddress(),
- *TargetAtom, 0);
-
- // Add a keep-alive relocation from the function to the FDE to ensure it is
- // not dead stripped.
- TargetAtom->addEdge(Edge::KeepAlive, 0, *CurRecordAtom, 0);
-
- // Skip over the PC range size field.
- if (auto Err = EHFrameReader.skip(G.getPointerSize()))
- return Err;
-
- if (LSDAFieldPresent) {
- uint64_t AugmentationDataSize;
- if (auto Err = EHFrameReader.readULEB128(AugmentationDataSize))
- return Err;
- if (AugmentationDataSize != G.getPointerSize())
- return make_error<JITLinkError>("Unexpected FDE augmentation data size "
- "(expected " +
- Twine(G.getPointerSize()) + ", got " +
- Twine(AugmentationDataSize) + ")");
- JITTargetAddress LSDAAddress = EHFrameAddress + EHFrameReader.getOffset();
- auto LSDADelta = readAbsolutePointer();
- if (!LSDADelta)
- return LSDADelta.takeError();
-
- JITTargetAddress LSDA = LSDAAddress + *LSDADelta;
-
- auto *LSDAAtom = G.getAtomByAddress(LSDA);
-
- if (!LSDAAtom)
- return make_error<JITLinkError>("FDE LSDA " + formatv("{0:x16}", LSDA) +
- " does not point at atom");
-
- if (LSDAAtom->getAddress() != LSDA)
- return make_error<JITLinkError>(
- "FDE LSDA " + formatv("{0:x16}", LSDA) +
- " does not point to start of atom at " +
- formatv("{0:x16}", LSDAAtom->getAddress()));
-
- LLVM_DEBUG(dbgs() << " FDE LSDA: " << *LSDAAtom << "\n");
-
- // LSDA looks good. Add relocations.
- CurRecordAtom->addEdge(FDEToTargetRelocKind,
- LSDAAddress - CurRecordAtom->getAddress(), *LSDAAtom,
- 0);
- }
-
- return Error::success();
-}
-
-Error addEHFrame(AtomGraph &G, Section &EHFrameSection,
- StringRef EHFrameContent, JITTargetAddress EHFrameAddress,
- Edge::Kind FDEToCIERelocKind,
- Edge::Kind FDEToTargetRelocKind) {
- return EHFrameParser(G, EHFrameSection, EHFrameContent, EHFrameAddress,
- FDEToCIERelocKind, FDEToTargetRelocKind)
- .atomize();
-}
-
-// Determine whether we can register EH tables.
-#if (defined(__GNUC__) && !defined(__ARM_EABI__) && !defined(__ia64__) && \
- !defined(__SEH__) && !defined(__USING_SJLJ_EXCEPTIONS__))
-#define HAVE_EHTABLE_SUPPORT 1
-#else
-#define HAVE_EHTABLE_SUPPORT 0
-#endif
-
-#if HAVE_EHTABLE_SUPPORT
-extern "C" void __register_frame(const void *);
-extern "C" void __deregister_frame(const void *);
-
-Error registerFrameWrapper(const void *P) {
- __register_frame(P);
- return Error::success();
-}
-
-Error deregisterFrameWrapper(const void *P) {
- __deregister_frame(P);
- return Error::success();
-}
-
-#else
-
-// The building compiler does not have __(de)register_frame but
-// it may be found at runtime in a dynamically-loaded library.
-// For example, this happens when building LLVM with Visual C++
-// but using the MingW runtime.
-static Error registerFrameWrapper(const void *P) {
- static void((*RegisterFrame)(const void *)) = 0;
-
- if (!RegisterFrame)
- *(void **)&RegisterFrame =
- llvm::sys::DynamicLibrary::SearchForAddressOfSymbol("__register_frame");
-
- if (RegisterFrame) {
- RegisterFrame(P);
- return Error::success();
- }
-
- return make_error<JITLinkError>("could not register eh-frame: "
- "__register_frame function not found");
-}
-
-static Error deregisterFrameWrapper(const void *P) {
- static void((*DeregisterFrame)(const void *)) = 0;
-
- if (!DeregisterFrame)
- *(void **)&DeregisterFrame =
- llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(
- "__deregister_frame");
-
- if (DeregisterFrame) {
- DeregisterFrame(P);
- return Error::success();
- }
-
- return make_error<JITLinkError>("could not deregister eh-frame: "
- "__deregister_frame function not found");
-}
-#endif
-
-#ifdef __APPLE__
-
-template <typename HandleFDEFn>
-Error walkAppleEHFrameSection(const char *const SectionStart,
- HandleFDEFn HandleFDE) {
- const char *CurCFIRecord = SectionStart;
- uint64_t Size = *reinterpret_cast<const uint32_t *>(CurCFIRecord);
-
- while (Size != 0) {
- const char *OffsetField = CurCFIRecord + (Size == 0xffffffff ? 12 : 4);
- if (Size == 0xffffffff)
- Size = *reinterpret_cast<const uint64_t *>(CurCFIRecord + 4) + 12;
- else
- Size += 4;
- uint32_t Offset = *reinterpret_cast<const uint32_t *>(OffsetField);
- if (Offset != 0)
- if (auto Err = HandleFDE(CurCFIRecord))
- return Err;
-
- LLVM_DEBUG({
- dbgs() << "Registering eh-frame section:\n";
- dbgs() << "Processing " << (Offset ? "FDE" : "CIE") << " @"
- << (void *)CurCFIRecord << ": [";
- for (unsigned I = 0; I < Size; ++I)
- dbgs() << format(" 0x%02" PRIx8, *(CurCFIRecord + I));
- dbgs() << " ]\n";
- });
- CurCFIRecord += Size;
-
- Size = *reinterpret_cast<const uint32_t *>(CurCFIRecord);
- }
-
- return Error::success();
-}
-
-#endif // __APPLE__
-
-Error registerEHFrameSection(const void *EHFrameSectionAddr) {
-#ifdef __APPLE__
- // On Darwin __register_frame has to be called for each FDE entry.
- return walkAppleEHFrameSection(static_cast<const char *>(EHFrameSectionAddr),
- registerFrameWrapper);
-#else
- // On Linux __register_frame takes a single argument:
- // a pointer to the start of the .eh_frame section.
-
- // How can it find the end? Because crtendS.o is linked
- // in and it has an .eh_frame section with four zero chars.
- return registerFrameWrapper(EHFrameSectionAddr);
-#endif
-}
-
-Error deregisterEHFrameSection(const void *EHFrameSectionAddr) {
-#ifdef __APPLE__
- return walkAppleEHFrameSection(static_cast<const char *>(EHFrameSectionAddr),
- deregisterFrameWrapper);
-#else
- return deregisterFrameWrapper(EHFrameSectionAddr);
-#endif
-}
-
-AtomGraphPassFunction createEHFrameRecorderPass(const Triple &TT,
- JITTargetAddress &EHFrameAddr) {
- const char *EHFrameSectionName = nullptr;
- if (TT.getObjectFormat() == Triple::MachO)
- EHFrameSectionName = "__eh_frame";
- else
- EHFrameSectionName = ".eh_frame";
-
- auto RecordEHFrame = [EHFrameSectionName,
- &EHFrameAddr](AtomGraph &G) -> Error {
- // Search for a non-empty eh-frame and record the address of the first atom
- // in it.
- JITTargetAddress Addr = 0;
- for (auto &S : G.sections())
- if (S.getName() == EHFrameSectionName && !S.atoms_empty()) {
- Addr = (*S.atoms().begin())->getAddress();
- for (auto *DA : S.atoms())
- if (DA->getAddress() < Addr)
- Addr = DA->getAddress();
- break;
- }
-
- EHFrameAddr = Addr;
- return Error::success();
- };
-
- return RecordEHFrame;
-}
-
-} // end namespace jitlink
-} // end namespace llvm
Removed: llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_EHFrameSupportImpl.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_EHFrameSupportImpl.h?rev=358868&view=auto
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_EHFrameSupportImpl.h (original)
+++ llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_EHFrameSupportImpl.h (removed)
@@ -1,65 +0,0 @@
-//===----- JITLink_EHFrameSupport.h - JITLink eh-frame utils ----*- 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
-//
-//===----------------------------------------------------------------------===//
-//
-// EHFrame registration support for JITLink.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_LIB_EXECUTIONENGINE_JITLINK_JITLINK_EHFRAMESUPPORTIMPL_H
-#define LLVM_LIB_EXECUTIONENGINE_JITLINK_JITLINK_EHFRAMESUPPORTIMPL_H
-
-#include "llvm/ExecutionEngine/JITLink/JITLink_EHFrameSupport.h"
-
-#include "llvm/ExecutionEngine/JITLink/JITLink.h"
-#include "llvm/Support/BinaryStreamReader.h"
-
-namespace llvm {
-namespace jitlink {
-
-/// A generic parser for eh-frame sections.
-///
-/// Adds atoms representing CIE and FDE entries, using the given FDE-to-CIE and
-/// FDEToTarget relocation kinds.
-class EHFrameParser {
-public:
- EHFrameParser(AtomGraph &G, Section &EHFrameSection, StringRef EHFrameContent,
- JITTargetAddress EHFrameAddress, Edge::Kind FDEToCIERelocKind,
- Edge::Kind FDEToTargetRelocKind);
- Error atomize();
-
-private:
- struct AugmentationInfo {
- bool AugmentationDataPresent = false;
- bool EHDataFieldPresent = false;
- uint8_t Fields[4] = {0x0, 0x0, 0x0, 0x0};
- };
-
- Expected<AugmentationInfo> parseAugmentationString();
- Expected<JITTargetAddress> readAbsolutePointer();
- Error processCIE();
- Error processFDE(JITTargetAddress CIEPointerAddress, uint32_t CIEPointer);
-
- AtomGraph &G;
- Section &EHFrameSection;
- StringRef EHFrameContent;
- JITTargetAddress EHFrameAddress;
- BinaryStreamReader EHFrameReader;
- DefinedAtom *CurRecordAtom = nullptr;
- bool LSDAFieldPresent = false;
- Edge::Kind FDEToCIERelocKind;
- Edge::Kind FDEToTargetRelocKind;
-};
-
-Error addEHFrame(AtomGraph &G, Section &EHFrameSection,
- StringRef EHFrameContent, JITTargetAddress EHFrameAddress,
- Edge::Kind FDEToCIERelocKind, Edge::Kind FDEToTargetRelocKind);
-
-} // end namespace jitlink
-} // end namespace llvm
-
-#endif // LLVM_LIB_EXECUTIONENGINE_JITLINK_JITLINK_EHFRAMESUPPORTIMPL_H
Removed: llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_MachO.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_MachO.cpp?rev=358868&view=auto
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_MachO.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_MachO.cpp (removed)
@@ -1,73 +0,0 @@
-//===------------ JITLink.cpp - Run-time JIT linker for MachO -------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/ExecutionEngine/JITLink/JITLink_MachO.h"
-
-#include "llvm/BinaryFormat/MachO.h"
-#include "llvm/ExecutionEngine/JITLink/JITLink_MachO_x86_64.h"
-#include "llvm/Support/Endian.h"
-#include "llvm/Support/Format.h"
-#include "llvm/Support/MemoryBuffer.h"
-
-using namespace llvm;
-
-#define DEBUG_TYPE "jitlink"
-
-namespace llvm {
-namespace jitlink {
-
-void jitLink_MachO(std::unique_ptr<JITLinkContext> Ctx) {
-
- // We don't want to do full MachO validation here. Just parse enough of the
- // header to find out what MachO linker to use.
-
- StringRef Data = Ctx->getObjectBuffer().getBuffer();
- if (Data.size() < 4) {
- Ctx->notifyFailed(make_error<JITLinkError>("Truncated MachO buffer"));
- return;
- }
-
- uint32_t Magic;
- memcpy(&Magic, Data.data(), sizeof(uint32_t));
- LLVM_DEBUG({
- dbgs() << "jitLink_MachO: magic = " << format("0x%08" PRIx32, Magic)
- << "\n";
- });
-
- if (Magic == MachO::MH_MAGIC || Magic == MachO::MH_CIGAM) {
- Ctx->notifyFailed(
- make_error<JITLinkError>("MachO 32-bit platforms not supported"));
- return;
- } else if (Magic == MachO::MH_MAGIC_64 || Magic == MachO::MH_CIGAM_64) {
- MachO::mach_header_64 Header;
-
- memcpy(&Header, Data.data(), sizeof(MachO::mach_header_64));
- if (Magic == MachO::MH_CIGAM_64)
- swapStruct(Header);
-
- LLVM_DEBUG({
- dbgs() << "jitLink_MachO: cputype = "
- << format("0x%08" PRIx32, Header.cputype)
- << ", cpusubtype = " << format("0x%08" PRIx32, Header.cpusubtype)
- << "\n";
- });
-
- switch (Header.cputype) {
- case MachO::CPU_TYPE_X86_64:
- return jitLink_MachO_x86_64(std::move(Ctx));
- }
- Ctx->notifyFailed(make_error<JITLinkError>("MachO-64 CPU type not valid"));
- return;
- }
-
- Ctx->notifyFailed(make_error<JITLinkError>("MachO magic not valid"));
-}
-
-} // end namespace jitlink
-} // end namespace llvm
Removed: llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_MachO_x86_64.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_MachO_x86_64.cpp?rev=358868&view=auto
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_MachO_x86_64.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_MachO_x86_64.cpp (removed)
@@ -1,605 +0,0 @@
-//===------- JITLink_MachO_x86_64.cpp - JIT linker functionality ----------===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-//
-// MachO jit-link implementation.
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/ExecutionEngine/JITLink/JITLink_MachO_x86_64.h"
-
-#include "BasicGOTAndStubsBuilder.h"
-#include "MachOAtomGraphBuilder.h"
-
-#define DEBUG_TYPE "jitlink"
-
-using namespace llvm;
-using namespace llvm::jitlink;
-using namespace llvm::jitlink::MachO_x86_64_Edges;
-
-namespace {
-
-class MachOAtomGraphBuilder_x86_64 : public MachOAtomGraphBuilder {
-public:
- MachOAtomGraphBuilder_x86_64(const object::MachOObjectFile &Obj)
- : MachOAtomGraphBuilder(Obj),
- NumSymbols(Obj.getSymtabLoadCommand().nsyms) {
- addCustomAtomizer("__eh_frame", [this](MachOSection &EHFrameSection) {
- return addEHFrame(getGraph(), EHFrameSection.getGenericSection(),
- EHFrameSection.getContent(),
- EHFrameSection.getAddress(), NegDelta32, Delta64);
- });
- }
-
-private:
- static Expected<MachOX86RelocationKind>
- getRelocationKind(const MachO::relocation_info &RI) {
- switch (RI.r_type) {
- case MachO::X86_64_RELOC_UNSIGNED:
- if (!RI.r_pcrel && RI.r_length == 3)
- return RI.r_extern ? Pointer64 : Pointer64Anon;
- break;
- case MachO::X86_64_RELOC_SIGNED:
- if (RI.r_pcrel && RI.r_length == 2)
- return RI.r_extern ? PCRel32 : PCRel32Anon;
- break;
- case MachO::X86_64_RELOC_BRANCH:
- if (RI.r_pcrel && RI.r_extern && RI.r_length == 2)
- return Branch32;
- break;
- case MachO::X86_64_RELOC_GOT_LOAD:
- if (RI.r_pcrel && RI.r_extern && RI.r_length == 2)
- return PCRel32GOTLoad;
- break;
- case MachO::X86_64_RELOC_GOT:
- if (RI.r_pcrel && RI.r_extern && RI.r_length == 2)
- return PCRel32GOT;
- break;
- case MachO::X86_64_RELOC_SUBTRACTOR:
- // SUBTRACTOR must be non-pc-rel, extern, with length 2 or 3.
- // Initially represent SUBTRACTOR relocations with 'Delta<W>'. They may
- // be turned into NegDelta<W> by parsePairRelocation.
- if (!RI.r_pcrel && RI.r_extern) {
- if (RI.r_length == 2)
- return Delta32;
- else if (RI.r_length == 3)
- return Delta64;
- }
- break;
- case MachO::X86_64_RELOC_SIGNED_1:
- if (RI.r_pcrel && RI.r_length == 2)
- return RI.r_extern ? PCRel32Minus1 : PCRel32Minus1Anon;
- break;
- case MachO::X86_64_RELOC_SIGNED_2:
- if (RI.r_pcrel && RI.r_length == 2)
- return RI.r_extern ? PCRel32Minus2 : PCRel32Minus2Anon;
- break;
- case MachO::X86_64_RELOC_SIGNED_4:
- if (RI.r_pcrel && RI.r_length == 2)
- return RI.r_extern ? PCRel32Minus4 : PCRel32Minus4Anon;
- break;
- case MachO::X86_64_RELOC_TLV:
- if (RI.r_pcrel && RI.r_extern && RI.r_length == 2)
- return PCRel32TLV;
- break;
- }
-
- return make_error<JITLinkError>(
- "Unsupported x86-64 relocation: address=" +
- formatv("{0:x8}", RI.r_address) +
- ", symbolnum=" + formatv("{0:x6}", RI.r_symbolnum) +
- ", kind=" + formatv("{0:x1}", RI.r_type) +
- ", pc_rel=" + (RI.r_pcrel ? "true" : "false") +
- ", extern= " + (RI.r_extern ? "true" : "false") +
- ", length=" + formatv("{0:d}", RI.r_length));
- }
-
- Expected<Atom &> findAtomBySymbolIndex(const MachO::relocation_info &RI) {
- auto &Obj = getObject();
- if (RI.r_symbolnum >= NumSymbols)
- return make_error<JITLinkError>("Symbol index out of range");
- auto SymI = Obj.getSymbolByIndex(RI.r_symbolnum);
- auto Name = SymI->getName();
- if (!Name)
- return Name.takeError();
- return getGraph().getAtomByName(*Name);
- }
-
- MachO::relocation_info
- getRelocationInfo(const object::relocation_iterator RelItr) {
- MachO::any_relocation_info ARI =
- getObject().getRelocation(RelItr->getRawDataRefImpl());
- MachO::relocation_info RI;
- memcpy(&RI, &ARI, sizeof(MachO::relocation_info));
- return RI;
- }
-
- using PairRelocInfo = std::tuple<MachOX86RelocationKind, Atom *, uint64_t>;
-
- // Parses paired SUBTRACTOR/UNSIGNED relocations and, on success,
- // returns the edge kind and addend to be used.
- Expected<PairRelocInfo>
- parsePairRelocation(DefinedAtom &AtomToFix, Edge::Kind SubtractorKind,
- const MachO::relocation_info &SubRI,
- JITTargetAddress FixupAddress, const char *FixupContent,
- object::relocation_iterator &UnsignedRelItr,
- object::relocation_iterator &RelEnd) {
- using namespace support;
-
- assert(((SubtractorKind == Delta32 && SubRI.r_length == 2) ||
- (SubtractorKind == Delta64 && SubRI.r_length == 3)) &&
- "Subtractor kind should match length");
- assert(SubRI.r_extern && "SUBTRACTOR reloc symbol should be extern");
- assert(!SubRI.r_pcrel && "SUBTRACTOR reloc should not be PCRel");
-
- if (UnsignedRelItr == RelEnd)
- return make_error<JITLinkError>("x86_64 SUBTRACTOR without paired "
- "UNSIGNED relocation");
-
- auto UnsignedRI = getRelocationInfo(UnsignedRelItr);
-
- if (SubRI.r_address != UnsignedRI.r_address)
- return make_error<JITLinkError>("x86_64 SUBTRACTOR and paired UNSIGNED "
- "point to different addresses");
-
- if (SubRI.r_length != UnsignedRI.r_length)
- return make_error<JITLinkError>("length of x86_64 SUBTRACTOR and paired "
- "UNSIGNED reloc must match");
-
- auto FromAtom = findAtomBySymbolIndex(SubRI);
- if (!FromAtom)
- return FromAtom.takeError();
-
- // Read the current fixup value.
- uint64_t FixupValue = 0;
- if (SubRI.r_length == 3)
- FixupValue = *(const ulittle64_t *)FixupContent;
- else
- FixupValue = *(const ulittle32_t *)FixupContent;
-
- // Find 'ToAtom' using symbol number or address, depending on whether the
- // paired UNSIGNED relocation is extern.
- Atom *ToAtom = nullptr;
- if (UnsignedRI.r_extern) {
- // Find target atom by symbol index.
- if (auto ToAtomOrErr = findAtomBySymbolIndex(UnsignedRI))
- ToAtom = &*ToAtomOrErr;
- else
- return ToAtomOrErr.takeError();
- } else {
- if (auto ToAtomOrErr = getGraph().findAtomByAddress(FixupValue))
- ToAtom = &*ToAtomOrErr;
- else
- return ToAtomOrErr.takeError();
- FixupValue -= ToAtom->getAddress();
- }
-
- MachOX86RelocationKind DeltaKind;
- Atom *TargetAtom;
- uint64_t Addend;
- if (&AtomToFix == &*FromAtom) {
- TargetAtom = ToAtom;
- DeltaKind = (SubRI.r_length == 3) ? Delta64 : Delta32;
- Addend = FixupValue + (FixupAddress - FromAtom->getAddress());
- // FIXME: handle extern 'from'.
- } else if (&AtomToFix == ToAtom) {
- TargetAtom = &*FromAtom;
- DeltaKind = (SubRI.r_length == 3) ? NegDelta64 : NegDelta32;
- Addend = FixupValue - (FixupAddress - ToAtom->getAddress());
- } else {
- // AtomToFix was neither FromAtom nor ToAtom.
- return make_error<JITLinkError>("SUBTRACTOR relocation must fix up "
- "either 'A' or 'B'");
- }
-
- return PairRelocInfo(DeltaKind, TargetAtom, Addend);
- }
-
- Error addRelocations() override {
- using namespace support;
- auto &G = getGraph();
- auto &Obj = getObject();
-
- for (auto &S : Obj.sections()) {
-
- JITTargetAddress SectionAddress = S.getAddress();
-
- for (auto RelItr = S.relocation_begin(), RelEnd = S.relocation_end();
- RelItr != RelEnd; ++RelItr) {
-
- MachO::relocation_info RI = getRelocationInfo(RelItr);
-
- // Sanity check the relocation kind.
- auto Kind = getRelocationKind(RI);
- if (!Kind)
- return Kind.takeError();
-
- // Find the address of the value to fix up.
- JITTargetAddress FixupAddress = SectionAddress + (uint32_t)RI.r_address;
-
- LLVM_DEBUG({
- dbgs() << "Processing relocation at "
- << format("0x%016" PRIx64, FixupAddress) << "\n";
- });
-
- // Find the atom that the fixup points to.
- DefinedAtom *AtomToFix = nullptr;
- {
- auto AtomToFixOrErr = G.findAtomByAddress(FixupAddress);
- if (!AtomToFixOrErr)
- return AtomToFixOrErr.takeError();
- AtomToFix = &*AtomToFixOrErr;
- }
-
- if (FixupAddress + static_cast<JITTargetAddress>(1 << RI.r_length) >
- AtomToFix->getAddress() + AtomToFix->getContent().size())
- return make_error<JITLinkError>(
- "Relocation content extends past end of fixup atom");
-
- // Get a pointer to the fixup content.
- const char *FixupContent = AtomToFix->getContent().data() +
- (FixupAddress - AtomToFix->getAddress());
-
- // The target atom and addend will be populated by the switch below.
- Atom *TargetAtom = nullptr;
- uint64_t Addend = 0;
-
- switch (*Kind) {
- case Branch32:
- case PCRel32:
- case PCRel32GOTLoad:
- case PCRel32GOT:
- if (auto TargetAtomOrErr = findAtomBySymbolIndex(RI))
- TargetAtom = &*TargetAtomOrErr;
- else
- return TargetAtomOrErr.takeError();
- Addend = *(const ulittle32_t *)FixupContent;
- break;
- case Pointer64:
- if (auto TargetAtomOrErr = findAtomBySymbolIndex(RI))
- TargetAtom = &*TargetAtomOrErr;
- else
- return TargetAtomOrErr.takeError();
- Addend = *(const ulittle64_t *)FixupContent;
- break;
- case Pointer64Anon: {
- JITTargetAddress TargetAddress = *(const ulittle64_t *)FixupContent;
- if (auto TargetAtomOrErr = G.findAtomByAddress(TargetAddress))
- TargetAtom = &*TargetAtomOrErr;
- else
- return TargetAtomOrErr.takeError();
- Addend = TargetAddress - TargetAtom->getAddress();
- break;
- }
- case PCRel32Minus1:
- case PCRel32Minus2:
- case PCRel32Minus4:
- if (auto TargetAtomOrErr = findAtomBySymbolIndex(RI))
- TargetAtom = &*TargetAtomOrErr;
- else
- return TargetAtomOrErr.takeError();
- Addend = *(const ulittle32_t *)FixupContent +
- (1 << (*Kind - PCRel32Minus1));
- break;
- case PCRel32Anon: {
- JITTargetAddress TargetAddress =
- FixupAddress + 4 + *(const ulittle32_t *)FixupContent;
- if (auto TargetAtomOrErr = G.findAtomByAddress(TargetAddress))
- TargetAtom = &*TargetAtomOrErr;
- else
- return TargetAtomOrErr.takeError();
- Addend = TargetAddress - TargetAtom->getAddress();
- break;
- }
- case PCRel32Minus1Anon:
- case PCRel32Minus2Anon:
- case PCRel32Minus4Anon: {
- JITTargetAddress Delta =
- static_cast<JITTargetAddress>(1 << (*Kind - PCRel32Minus1Anon));
- JITTargetAddress TargetAddress =
- FixupAddress + 4 + Delta + *(const ulittle32_t *)FixupContent;
- if (auto TargetAtomOrErr = G.findAtomByAddress(TargetAddress))
- TargetAtom = &*TargetAtomOrErr;
- else
- return TargetAtomOrErr.takeError();
- Addend = TargetAddress - TargetAtom->getAddress();
- break;
- }
- case Delta32:
- case Delta64: {
- // We use Delta32/Delta64 to represent SUBTRACTOR relocations.
- // parsePairRelocation handles the paired reloc, and returns the
- // edge kind to be used (either Delta32/Delta64, or
- // NegDelta32/NegDelta64, depending on the direction of the
- // subtraction) along with the addend.
- auto PairInfo =
- parsePairRelocation(*AtomToFix, *Kind, RI, FixupAddress,
- FixupContent, ++RelItr, RelEnd);
- if (!PairInfo)
- return PairInfo.takeError();
- std::tie(*Kind, TargetAtom, Addend) = *PairInfo;
- assert(TargetAtom && "No target atom from parsePairRelocation?");
- break;
- }
- default:
- llvm_unreachable("Special relocation kind should not appear in "
- "mach-o file");
- }
-
- LLVM_DEBUG({
- Edge GE(*Kind, FixupAddress - AtomToFix->getAddress(), *TargetAtom,
- Addend);
- printEdge(dbgs(), *AtomToFix, GE,
- getMachOX86RelocationKindName(*Kind));
- dbgs() << "\n";
- });
- AtomToFix->addEdge(*Kind, FixupAddress - AtomToFix->getAddress(),
- *TargetAtom, Addend);
- }
- }
- return Error::success();
- }
-
- unsigned NumSymbols = 0;
-};
-
-class MachO_x86_64_GOTAndStubsBuilder
- : public BasicGOTAndStubsBuilder<MachO_x86_64_GOTAndStubsBuilder> {
-public:
- MachO_x86_64_GOTAndStubsBuilder(AtomGraph &G)
- : BasicGOTAndStubsBuilder<MachO_x86_64_GOTAndStubsBuilder>(G) {}
-
- bool isGOTEdge(Edge &E) const {
- return E.getKind() == PCRel32GOT || E.getKind() == PCRel32GOTLoad;
- }
-
- DefinedAtom &createGOTEntry(Atom &Target) {
- auto &GOTEntryAtom = G.addAnonymousAtom(getGOTSection(), 0x0, 8);
- GOTEntryAtom.setContent(
- StringRef(reinterpret_cast<const char *>(NullGOTEntryContent), 8));
- GOTEntryAtom.addEdge(Pointer64, 0, Target, 0);
- return GOTEntryAtom;
- }
-
- void fixGOTEdge(Edge &E, Atom &GOTEntry) {
- assert((E.getKind() == PCRel32GOT || E.getKind() == PCRel32GOTLoad) &&
- "Not a GOT edge?");
- E.setKind(PCRel32);
- E.setTarget(GOTEntry);
- // Leave the edge addend as-is.
- }
-
- bool isExternalBranchEdge(Edge &E) {
- return E.getKind() == Branch32 && !E.getTarget().isDefined();
- }
-
- DefinedAtom &createStub(Atom &Target) {
- auto &StubAtom = G.addAnonymousAtom(getStubsSection(), 0x0, 2);
- StubAtom.setContent(
- StringRef(reinterpret_cast<const char *>(StubContent), 6));
-
- // Re-use GOT entries for stub targets.
- auto &GOTEntryAtom = getGOTEntryAtom(Target);
- StubAtom.addEdge(PCRel32, 2, GOTEntryAtom, 0);
-
- return StubAtom;
- }
-
- void fixExternalBranchEdge(Edge &E, Atom &Stub) {
- assert(E.getKind() == Branch32 && "Not a Branch32 edge?");
- assert(E.getAddend() == 0 && "Branch32 edge has non-zero addend?");
- E.setTarget(Stub);
- }
-
-private:
- Section &getGOTSection() {
- if (!GOTSection)
- GOTSection = &G.createSection("$__GOT", sys::Memory::MF_READ, false);
- return *GOTSection;
- }
-
- Section &getStubsSection() {
- if (!StubsSection) {
- auto StubsProt = static_cast<sys::Memory::ProtectionFlags>(
- sys::Memory::MF_READ | sys::Memory::MF_EXEC);
- StubsSection = &G.createSection("$__STUBS", StubsProt, false);
- }
- return *StubsSection;
- }
-
- static const uint8_t NullGOTEntryContent[8];
- static const uint8_t StubContent[6];
- Section *GOTSection = nullptr;
- Section *StubsSection = nullptr;
-};
-
-const uint8_t MachO_x86_64_GOTAndStubsBuilder::NullGOTEntryContent[8] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-const uint8_t MachO_x86_64_GOTAndStubsBuilder::StubContent[6] = {
- 0xFF, 0x25, 0x00, 0x00, 0x00, 0x00};
-} // namespace
-
-namespace llvm {
-namespace jitlink {
-
-class MachOJITLinker_x86_64 : public JITLinker<MachOJITLinker_x86_64> {
- friend class JITLinker<MachOJITLinker_x86_64>;
-
-public:
- MachOJITLinker_x86_64(std::unique_ptr<JITLinkContext> Ctx,
- PassConfiguration PassConfig)
- : JITLinker(std::move(Ctx), std::move(PassConfig)) {}
-
-private:
- StringRef getEdgeKindName(Edge::Kind R) const override {
- return getMachOX86RelocationKindName(R);
- }
-
- Expected<std::unique_ptr<AtomGraph>>
- buildGraph(MemoryBufferRef ObjBuffer) override {
- auto MachOObj = object::ObjectFile::createMachOObjectFile(ObjBuffer);
- if (!MachOObj)
- return MachOObj.takeError();
- return MachOAtomGraphBuilder_x86_64(**MachOObj).buildGraph();
- }
-
- static Error targetOutOfRangeError(const Edge &E) {
- std::string ErrMsg;
- {
- raw_string_ostream ErrStream(ErrMsg);
- ErrStream << "Target \"" << E.getTarget() << "\" out of range";
- }
- return make_error<JITLinkError>(std::move(ErrMsg));
- }
-
- Error applyFixup(DefinedAtom &A, const Edge &E, char *AtomWorkingMem) const {
- using namespace support;
-
- char *FixupPtr = AtomWorkingMem + E.getOffset();
- JITTargetAddress FixupAddress = A.getAddress() + E.getOffset();
-
- switch (E.getKind()) {
- case Branch32:
- case PCRel32:
- case PCRel32Anon: {
- int64_t Value =
- E.getTarget().getAddress() - (FixupAddress + 4) + E.getAddend();
- if (Value < std::numeric_limits<int32_t>::min() ||
- Value > std::numeric_limits<int32_t>::max())
- return targetOutOfRangeError(E);
- *(little32_t *)FixupPtr = Value;
- break;
- }
- case Pointer64:
- case Pointer64Anon: {
- uint64_t Value = E.getTarget().getAddress() + E.getAddend();
- *(ulittle64_t *)FixupPtr = Value;
- break;
- }
- case PCRel32Minus1:
- case PCRel32Minus2:
- case PCRel32Minus4: {
- int Delta = 4 + (1 << (E.getKind() - PCRel32Minus1));
- int64_t Value =
- E.getTarget().getAddress() - (FixupAddress + Delta) + E.getAddend();
- if (Value < std::numeric_limits<int32_t>::min() ||
- Value > std::numeric_limits<int32_t>::max())
- return targetOutOfRangeError(E);
- *(little32_t *)FixupPtr = Value;
- break;
- }
- case PCRel32Minus1Anon:
- case PCRel32Minus2Anon:
- case PCRel32Minus4Anon: {
- int Delta = 4 + (1 << (E.getKind() - PCRel32Minus1Anon));
- int64_t Value =
- E.getTarget().getAddress() - (FixupAddress + Delta) + E.getAddend();
- if (Value < std::numeric_limits<int32_t>::min() ||
- Value > std::numeric_limits<int32_t>::max())
- return targetOutOfRangeError(E);
- *(little32_t *)FixupPtr = Value;
- break;
- }
- case Delta32:
- case Delta64:
- case NegDelta32:
- case NegDelta64: {
- int64_t Value;
- if (E.getKind() == Delta32 || E.getKind() == Delta64)
- Value = E.getTarget().getAddress() - FixupAddress + E.getAddend();
- else
- Value = FixupAddress - E.getTarget().getAddress() + E.getAddend();
-
- if (E.getKind() == Delta32 || E.getKind() == NegDelta32) {
- if (Value < std::numeric_limits<int32_t>::min() ||
- Value > std::numeric_limits<int32_t>::max())
- return targetOutOfRangeError(E);
- *(little32_t *)FixupPtr = Value;
- } else
- *(little64_t *)FixupPtr = Value;
- break;
- }
- default:
- llvm_unreachable("Unrecognized edge kind");
- }
-
- return Error::success();
- }
-
- uint64_t NullValue = 0;
-};
-
-void jitLink_MachO_x86_64(std::unique_ptr<JITLinkContext> Ctx) {
- PassConfiguration Config;
- Triple TT("x86_64-apple-macosx");
-
- if (Ctx->shouldAddDefaultTargetPasses(TT)) {
- // Add a mark-live pass.
- if (auto MarkLive = Ctx->getMarkLivePass(TT))
- Config.PrePrunePasses.push_back(std::move(MarkLive));
- else
- Config.PrePrunePasses.push_back(markAllAtomsLive);
-
- // Add an in-place GOT/Stubs pass.
- Config.PostPrunePasses.push_back([](AtomGraph &G) -> Error {
- MachO_x86_64_GOTAndStubsBuilder(G).run();
- return Error::success();
- });
- }
-
- if (auto Err = Ctx->modifyPassConfig(TT, Config))
- return Ctx->notifyFailed(std::move(Err));
-
- // Construct a JITLinker and run the link function.
- MachOJITLinker_x86_64::link(std::move(Ctx), std::move(Config));
-}
-
-StringRef getMachOX86RelocationKindName(Edge::Kind R) {
- switch (R) {
- case Branch32:
- return "Branch32";
- case Pointer64:
- return "Pointer64";
- case Pointer64Anon:
- return "Pointer64Anon";
- case PCRel32:
- return "PCRel32";
- case PCRel32Minus1:
- return "PCRel32Minus1";
- case PCRel32Minus2:
- return "PCRel32Minus2";
- case PCRel32Minus4:
- return "PCRel32Minus4";
- case PCRel32Anon:
- return "PCRel32Anon";
- case PCRel32Minus1Anon:
- return "PCRel32Minus1Anon";
- case PCRel32Minus2Anon:
- return "PCRel32Minus2Anon";
- case PCRel32Minus4Anon:
- return "PCRel32Minus4Anon";
- case PCRel32GOTLoad:
- return "PCRel32GOTLoad";
- case PCRel32GOT:
- return "PCRel32GOT";
- case PCRel32TLV:
- return "PCRel32TLV";
- case Delta32:
- return "Delta32";
- case Delta64:
- return "Delta64";
- case NegDelta32:
- return "NegDelta32";
- case NegDelta64:
- return "NegDelta64";
- default:
- return getGenericEdgeKindName(static_cast<Edge::Kind>(R));
- }
-}
-
-} // end namespace jitlink
-} // end namespace llvm
Copied: llvm/trunk/lib/ExecutionEngine/JITLink/MachO.cpp (from r358865, llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_MachO.cpp)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JITLink/MachO.cpp?p2=llvm/trunk/lib/ExecutionEngine/JITLink/MachO.cpp&p1=llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_MachO.cpp&r1=358865&r2=358869&rev=358869&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_MachO.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/JITLink/MachO.cpp Sun Apr 21 20:03:09 2019
@@ -1,4 +1,4 @@
-//===------------ JITLink.cpp - Run-time JIT linker for MachO -------------===//
+//===-------------- MachO.cpp - JIT linker function for MachO -------------===//
//
// The LLVM Compiler Infrastructure
//
@@ -6,11 +6,15 @@
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// MachO jit-link function.
+//
+//===----------------------------------------------------------------------===//
-#include "llvm/ExecutionEngine/JITLink/JITLink_MachO.h"
+#include "llvm/ExecutionEngine/JITLink/MachO.h"
#include "llvm/BinaryFormat/MachO.h"
-#include "llvm/ExecutionEngine/JITLink/JITLink_MachO_x86_64.h"
+#include "llvm/ExecutionEngine/JITLink/MachO_x86_64.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/MemoryBuffer.h"
Copied: llvm/trunk/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp (from r358865, llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_MachO_x86_64.cpp)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp?p2=llvm/trunk/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp&p1=llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_MachO_x86_64.cpp&r1=358865&r2=358869&rev=358869&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/JITLink/JITLink_MachO_x86_64.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp Sun Apr 21 20:03:09 2019
@@ -1,4 +1,4 @@
-//===------- JITLink_MachO_x86_64.cpp - JIT linker functionality ----------===//
+//===---- MachO_x86_64.cpp -JIT linker implementation for MachO/x86-64 ----===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -6,11 +6,11 @@
//
//===----------------------------------------------------------------------===//
//
-// MachO jit-link implementation.
+// MachO/x86-64 jit-link implementation.
//
//===----------------------------------------------------------------------===//
-#include "llvm/ExecutionEngine/JITLink/JITLink_MachO_x86_64.h"
+#include "llvm/ExecutionEngine/JITLink/MachO_x86_64.h"
#include "BasicGOTAndStubsBuilder.h"
#include "MachOAtomGraphBuilder.h"
Modified: llvm/trunk/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp?rev=358869&r1=358868&r2=358869&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp Sun Apr 21 20:03:09 2019
@@ -9,7 +9,7 @@
#include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
#include "llvm/ADT/Optional.h"
-#include "llvm/ExecutionEngine/JITLink/JITLink_EHFrameSupport.h"
+#include "llvm/ExecutionEngine/JITLink/EHFrameSupport.h"
#include <vector>
Modified: llvm/trunk/unittests/ExecutionEngine/JITLink/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ExecutionEngine/JITLink/CMakeLists.txt?rev=358869&r1=358868&r2=358869&view=diff
==============================================================================
--- llvm/trunk/unittests/ExecutionEngine/JITLink/CMakeLists.txt (original)
+++ llvm/trunk/unittests/ExecutionEngine/JITLink/CMakeLists.txt Sun Apr 21 20:03:09 2019
@@ -12,7 +12,7 @@ set(LLVM_LINK_COMPONENTS
add_llvm_unittest(JITLinkTests
JITLinkTestCommon.cpp
- JITLinkTest_MachO_x86_64_Tests.cpp
+ MachO_x86_64_Tests.cpp
)
target_link_libraries(JITLinkTests PRIVATE LLVMTestingSupport)
Removed: llvm/trunk/unittests/ExecutionEngine/JITLink/JITLinkTest_MachO_x86_64_Tests.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ExecutionEngine/JITLink/JITLinkTest_MachO_x86_64_Tests.cpp?rev=358868&view=auto
==============================================================================
--- llvm/trunk/unittests/ExecutionEngine/JITLink/JITLinkTest_MachO_x86_64_Tests.cpp (original)
+++ llvm/trunk/unittests/ExecutionEngine/JITLink/JITLinkTest_MachO_x86_64_Tests.cpp (removed)
@@ -1,229 +0,0 @@
-//===---- JITLinkTest_MachO_x86_64.cpp - Tests for JITLink MachO/x86-64 ---===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-
-#include "JITLinkTestCommon.h"
-
-#include "llvm/ADT/DenseSet.h"
-#include "llvm/ExecutionEngine/JITLink/JITLink_MachO_x86_64.h"
-#include "llvm/Testing/Support/Error.h"
-
-#include "gtest/gtest.h"
-
-using namespace llvm;
-using namespace llvm::jitlink;
-using namespace llvm::jitlink::MachO_x86_64_Edges;
-
-namespace {
-
-class JITLinkTest_MachO_x86_64 : public JITLinkTestCommon,
- public testing::Test {
-public:
- using BasicVerifyGraphFunction =
- std::function<void(AtomGraph &, const MCDisassembler &)>;
-
- void runBasicVerifyGraphTest(StringRef AsmSrc, StringRef Triple,
- StringMap<JITEvaluatedSymbol> Externals,
- bool PIC, bool LargeCodeModel,
- MCTargetOptions Options,
- BasicVerifyGraphFunction RunGraphTest) {
- auto TR = getTestResources(AsmSrc, Triple, PIC, LargeCodeModel,
- std::move(Options));
- if (!TR) {
- dbgs() << "Skipping JITLInk unit test: " << toString(TR.takeError())
- << "\n";
- return;
- }
-
- auto JTCtx = llvm::make_unique<TestJITLinkContext>(
- **TR, [&](AtomGraph &G) { RunGraphTest(G, (*TR)->getDisassembler()); });
-
- JTCtx->externals() = std::move(Externals);
-
- jitLink_MachO_x86_64(std::move(JTCtx));
- }
-
-protected:
- static void verifyIsPointerTo(AtomGraph &G, DefinedAtom &A, Atom &Target) {
- EXPECT_EQ(A.edges_size(), 1U) << "Incorrect number of edges for pointer";
- if (A.edges_size() != 1U)
- return;
- auto &E = *A.edges().begin();
- EXPECT_EQ(E.getKind(), Pointer64)
- << "Expected pointer to have a pointer64 relocation";
- EXPECT_EQ(&E.getTarget(), &Target) << "Expected edge to point at target";
- EXPECT_THAT_EXPECTED(readInt<uint64_t>(G, A), HasValue(Target.getAddress()))
- << "Pointer does not point to target";
- }
-
- static void verifyGOTLoad(AtomGraph &G, DefinedAtom &A, Edge &E,
- Atom &Target) {
- EXPECT_EQ(E.getAddend(), 0U) << "Expected GOT load to have a zero addend";
- EXPECT_TRUE(E.getTarget().isDefined())
- << "GOT entry should be a defined atom";
- if (!E.getTarget().isDefined())
- return;
-
- verifyIsPointerTo(G, static_cast<DefinedAtom &>(E.getTarget()), Target);
- }
-
- static void verifyCall(const MCDisassembler &Dis, AtomGraph &G,
- DefinedAtom &Caller, Edge &E, Atom &Callee) {
- EXPECT_EQ(E.getKind(), Branch32) << "Edge is not a Branch32";
- EXPECT_EQ(E.getAddend(), 0U) << "Expected no addend on stub call";
- EXPECT_EQ(&E.getTarget(), &Callee)
- << "Edge does not point at expected callee";
-
- JITTargetAddress FixupAddress = Caller.getAddress() + E.getOffset();
- uint64_t PCRelDelta = Callee.getAddress() - (FixupAddress + 4);
-
- EXPECT_THAT_EXPECTED(
- decodeImmediateOperand(Dis, Caller, 0, E.getOffset() - 1),
- HasValue(PCRelDelta));
- }
-
- static void verifyIndirectCall(const MCDisassembler &Dis, AtomGraph &G,
- DefinedAtom &Caller, Edge &E, Atom &Callee) {
- EXPECT_EQ(E.getKind(), PCRel32) << "Edge is not a PCRel32";
- EXPECT_EQ(E.getAddend(), 0) << "Expected no addend on stub cal";
- EXPECT_TRUE(E.getTarget().isDefined()) << "Target is not a defined atom";
- if (!E.getTarget().isDefined())
- return;
- verifyIsPointerTo(G, static_cast<DefinedAtom &>(E.getTarget()), Callee);
-
- JITTargetAddress FixupAddress = Caller.getAddress() + E.getOffset();
- uint64_t PCRelDelta = E.getTarget().getAddress() - (FixupAddress + 4);
-
- EXPECT_THAT_EXPECTED(
- decodeImmediateOperand(Dis, Caller, 3, E.getOffset() - 2),
- HasValue(PCRelDelta));
- }
-
- static void verifyCallViaStub(const MCDisassembler &Dis, AtomGraph &G,
- DefinedAtom &Caller, Edge &E, Atom &Callee) {
- verifyCall(Dis, G, Caller, E, E.getTarget());
-
- if (!E.getTarget().isDefined()) {
- ADD_FAILURE() << "Edge target is not a stub";
- return;
- }
-
- auto &StubAtom = static_cast<DefinedAtom &>(E.getTarget());
- EXPECT_EQ(StubAtom.edges_size(), 1U)
- << "Expected one edge from stub to target";
-
- auto &StubEdge = *StubAtom.edges().begin();
-
- verifyIndirectCall(Dis, G, static_cast<DefinedAtom &>(StubAtom), StubEdge,
- Callee);
- }
-};
-
-} // end anonymous namespace
-
-// Test each operation on LegacyObjectTransformLayer.
-TEST_F(JITLinkTest_MachO_x86_64, BasicRelocations) {
- runBasicVerifyGraphTest(
- R"(
- .section __TEXT,__text,regular,pure_instructions
- .build_version macos, 10, 14
- .globl _bar
- .p2align 4, 0x90
- _bar:
- callq _baz
-
- .globl _foo
- .p2align 4, 0x90
- _foo:
- callq _bar
- _foo.1:
- movq _y at GOTPCREL(%rip), %rcx
- _foo.2:
- movq _p(%rip), %rdx
-
- .section __DATA,__data
- .globl _x
- .p2align 2
- _x:
- .long 42
-
- .globl _p
- .p2align 3
- _p:
- .quad _x
-
- .subsections_via_symbols)",
- "x86_64-apple-macosx10.14",
- {{"_y", JITEvaluatedSymbol(0xdeadbeef, JITSymbolFlags::Exported)},
- {"_baz", JITEvaluatedSymbol(0xcafef00d, JITSymbolFlags::Exported)}},
- true, false, MCTargetOptions(),
- [](AtomGraph &G, const MCDisassembler &Dis) {
- // Name the atoms in the asm above.
- auto &Baz = atom(G, "_baz");
- auto &Y = atom(G, "_y");
-
- auto &Bar = definedAtom(G, "_bar");
- auto &Foo = definedAtom(G, "_foo");
- auto &Foo_1 = definedAtom(G, "_foo.1");
- auto &Foo_2 = definedAtom(G, "_foo.2");
- auto &X = definedAtom(G, "_x");
- auto &P = definedAtom(G, "_p");
-
- // Check unsigned reloc for _p
- {
- EXPECT_EQ(P.edges_size(), 1U) << "Unexpected number of relocations";
- EXPECT_EQ(P.edges().begin()->getKind(), Pointer64)
- << "Unexpected edge kind for _p";
- EXPECT_THAT_EXPECTED(readInt<uint64_t>(G, P),
- HasValue(X.getAddress()))
- << "Unsigned relocation did not apply correctly";
- }
-
- // Check that _bar is a call-via-stub to _baz.
- // This will check that the call goes to a stub, that the stub is an
- // indirect call, and that the pointer for the indirect call points to
- // baz.
- {
- EXPECT_EQ(Bar.edges_size(), 1U)
- << "Incorrect number of edges for bar";
- EXPECT_EQ(Bar.edges().begin()->getKind(), Branch32)
- << "Unexpected edge kind for _bar";
- verifyCallViaStub(Dis, G, Bar, *Bar.edges().begin(), Baz);
- }
-
- // Check that _foo is a direct call to _bar.
- {
- EXPECT_EQ(Foo.edges_size(), 1U)
- << "Incorrect number of edges for foo";
- EXPECT_EQ(Foo.edges().begin()->getKind(), Branch32);
- verifyCall(Dis, G, Foo, *Foo.edges().begin(), Bar);
- }
-
- // Check .got load in _foo.1
- {
- EXPECT_EQ(Foo_1.edges_size(), 1U)
- << "Incorrect number of edges for foo_1";
- EXPECT_EQ(Foo_1.edges().begin()->getKind(), PCRel32);
- verifyGOTLoad(G, Foo_1, *Foo_1.edges().begin(), Y);
- }
-
- // Check PCRel ref to _p in _foo.2
- {
- EXPECT_EQ(Foo_2.edges_size(), 1U)
- << "Incorrect number of edges for foo_2";
- EXPECT_EQ(Foo_2.edges().begin()->getKind(), PCRel32);
-
- JITTargetAddress FixupAddress =
- Foo_2.getAddress() + Foo_2.edges().begin()->getOffset();
- uint64_t PCRelDelta = P.getAddress() - (FixupAddress + 4);
-
- EXPECT_THAT_EXPECTED(decodeImmediateOperand(Dis, Foo_2, 4, 0),
- HasValue(PCRelDelta))
- << "PCRel load does not reference expected target";
- }
- });
-}
Copied: llvm/trunk/unittests/ExecutionEngine/JITLink/MachO_x86_64_Tests.cpp (from r358865, llvm/trunk/unittests/ExecutionEngine/JITLink/JITLinkTest_MachO_x86_64_Tests.cpp)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ExecutionEngine/JITLink/MachO_x86_64_Tests.cpp?p2=llvm/trunk/unittests/ExecutionEngine/JITLink/MachO_x86_64_Tests.cpp&p1=llvm/trunk/unittests/ExecutionEngine/JITLink/JITLinkTest_MachO_x86_64_Tests.cpp&r1=358865&r2=358869&rev=358869&view=diff
==============================================================================
--- llvm/trunk/unittests/ExecutionEngine/JITLink/JITLinkTest_MachO_x86_64_Tests.cpp (original)
+++ llvm/trunk/unittests/ExecutionEngine/JITLink/MachO_x86_64_Tests.cpp Sun Apr 21 20:03:09 2019
@@ -1,4 +1,4 @@
-//===---- JITLinkTest_MachO_x86_64.cpp - Tests for JITLink MachO/x86-64 ---===//
+//===--------- MachO_x86_64.cpp - Tests for JITLink MachO/x86-64 ----------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -9,7 +9,7 @@
#include "JITLinkTestCommon.h"
#include "llvm/ADT/DenseSet.h"
-#include "llvm/ExecutionEngine/JITLink/JITLink_MachO_x86_64.h"
+#include "llvm/ExecutionEngine/JITLink/MachO_x86_64.h"
#include "llvm/Testing/Support/Error.h"
#include "gtest/gtest.h"
More information about the llvm-commits
mailing list