xref: /freebsd-src/contrib/llvm-project/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h (revision 7a6dacaca14b62ca4b74406814becb87a3fefac0)
10b57cec5SDimitry Andric //===-- RuntimeDyldCheckerImpl.h -- RuntimeDyld test framework --*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #ifndef LLVM_LIB_EXECUTIONENGINE_RUNTIMEDYLD_RUNTIMEDYLDCHECKERIMPL_H
100b57cec5SDimitry Andric #define LLVM_LIB_EXECUTIONENGINE_RUNTIMEDYLD_RUNTIMEDYLDCHECKERIMPL_H
110b57cec5SDimitry Andric 
120b57cec5SDimitry Andric #include "RuntimeDyldImpl.h"
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric namespace llvm {
150b57cec5SDimitry Andric 
165f757f3fSDimitry Andric /// Holds target-specific properties for a symbol.
175f757f3fSDimitry Andric using TargetFlagsType = uint8_t;
185f757f3fSDimitry Andric 
190b57cec5SDimitry Andric class RuntimeDyldCheckerImpl {
200b57cec5SDimitry Andric   friend class RuntimeDyldChecker;
210b57cec5SDimitry Andric   friend class RuntimeDyldCheckerExprEval;
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric   using IsSymbolValidFunction =
240b57cec5SDimitry Andric     RuntimeDyldChecker::IsSymbolValidFunction;
250b57cec5SDimitry Andric   using GetSymbolInfoFunction = RuntimeDyldChecker::GetSymbolInfoFunction;
260b57cec5SDimitry Andric   using GetSectionInfoFunction = RuntimeDyldChecker::GetSectionInfoFunction;
270b57cec5SDimitry Andric   using GetStubInfoFunction = RuntimeDyldChecker::GetStubInfoFunction;
280b57cec5SDimitry Andric   using GetGOTInfoFunction = RuntimeDyldChecker::GetGOTInfoFunction;
290b57cec5SDimitry Andric 
300b57cec5SDimitry Andric public:
315f757f3fSDimitry Andric   RuntimeDyldCheckerImpl(IsSymbolValidFunction IsSymbolValid,
325f757f3fSDimitry Andric                          GetSymbolInfoFunction GetSymbolInfo,
335f757f3fSDimitry Andric                          GetSectionInfoFunction GetSectionInfo,
345f757f3fSDimitry Andric                          GetStubInfoFunction GetStubInfo,
355f757f3fSDimitry Andric                          GetGOTInfoFunction GetGOTInfo,
365f757f3fSDimitry Andric                          llvm::endianness Endianness, Triple TT, StringRef CPU,
375f757f3fSDimitry Andric                          SubtargetFeatures TF, llvm::raw_ostream &ErrStream);
380b57cec5SDimitry Andric 
390b57cec5SDimitry Andric   bool check(StringRef CheckExpr) const;
400b57cec5SDimitry Andric   bool checkAllRulesInBuffer(StringRef RulePrefix, MemoryBuffer *MemBuf) const;
410b57cec5SDimitry Andric 
420b57cec5SDimitry Andric private:
430b57cec5SDimitry Andric 
440b57cec5SDimitry Andric   // StubMap typedefs.
450b57cec5SDimitry Andric 
460b57cec5SDimitry Andric   Expected<JITSymbolResolver::LookupResult>
470b57cec5SDimitry Andric   lookup(const JITSymbolResolver::LookupSet &Symbols) const;
480b57cec5SDimitry Andric 
490b57cec5SDimitry Andric   bool isSymbolValid(StringRef Symbol) const;
500b57cec5SDimitry Andric   uint64_t getSymbolLocalAddr(StringRef Symbol) const;
510b57cec5SDimitry Andric   uint64_t getSymbolRemoteAddr(StringRef Symbol) const;
520b57cec5SDimitry Andric   uint64_t readMemoryAtAddr(uint64_t Addr, unsigned Size) const;
530b57cec5SDimitry Andric 
540b57cec5SDimitry Andric   StringRef getSymbolContent(StringRef Symbol) const;
550b57cec5SDimitry Andric 
565f757f3fSDimitry Andric   TargetFlagsType getTargetFlag(StringRef Symbol) const;
575f757f3fSDimitry Andric   Triple getTripleForSymbol(TargetFlagsType Flag) const;
getCPU()585f757f3fSDimitry Andric   StringRef getCPU() const { return CPU; }
getFeatures()595f757f3fSDimitry Andric   SubtargetFeatures getFeatures() const { return TF; }
605f757f3fSDimitry Andric 
610b57cec5SDimitry Andric   std::pair<uint64_t, std::string> getSectionAddr(StringRef FileName,
620b57cec5SDimitry Andric                                                   StringRef SectionName,
630b57cec5SDimitry Andric                                                   bool IsInsideLoad) const;
640b57cec5SDimitry Andric 
650b57cec5SDimitry Andric   std::pair<uint64_t, std::string>
660b57cec5SDimitry Andric   getStubOrGOTAddrFor(StringRef StubContainerName, StringRef Symbol,
67*7a6dacacSDimitry Andric                       StringRef StubKindFilter, bool IsInsideLoad,
68*7a6dacacSDimitry Andric                       bool IsStubAddr) const;
690b57cec5SDimitry Andric 
70bdd1243dSDimitry Andric   std::optional<uint64_t> getSectionLoadAddress(void *LocalAddr) const;
710b57cec5SDimitry Andric 
720b57cec5SDimitry Andric   IsSymbolValidFunction IsSymbolValid;
730b57cec5SDimitry Andric   GetSymbolInfoFunction GetSymbolInfo;
740b57cec5SDimitry Andric   GetSectionInfoFunction GetSectionInfo;
750b57cec5SDimitry Andric   GetStubInfoFunction GetStubInfo;
760b57cec5SDimitry Andric   GetGOTInfoFunction GetGOTInfo;
775f757f3fSDimitry Andric   llvm::endianness Endianness;
785f757f3fSDimitry Andric   Triple TT;
795f757f3fSDimitry Andric   std::string CPU;
805f757f3fSDimitry Andric   SubtargetFeatures TF;
810b57cec5SDimitry Andric   llvm::raw_ostream &ErrStream;
820b57cec5SDimitry Andric };
830b57cec5SDimitry Andric }
840b57cec5SDimitry Andric 
850b57cec5SDimitry Andric #endif
86