mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-29 00:56:06 +00:00

A distinction that doesn't _usually_ matter is that the MachO::SymbolKind is really a mapping of entries in TBD files not symbols. To better understand this, rename the enum so it represents an encoding mapped to TBDs as opposed to symbols alone. For example, it can be a bit confusing that "GlobalSymbol" is a enum value when all of those values can represent a GlobalSymbol.
66 lines
2.1 KiB
C++
66 lines
2.1 KiB
C++
//===-- TextStubHelpers.cpp -------------------------------------*- 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
|
|
//
|
|
//===-----------------------------------------------------------------------===/
|
|
|
|
#include "llvm/Support/MemoryBuffer.h"
|
|
#include "llvm/TextAPI/InterfaceFile.h"
|
|
#include <algorithm>
|
|
#include <string>
|
|
|
|
#ifndef TEXT_STUB_HELPERS_H
|
|
#define TEXT_STUB_HELPERS_H
|
|
|
|
namespace llvm {
|
|
struct ExportedSymbol {
|
|
MachO::EncodeKind Kind = MachO::EncodeKind::GlobalSymbol;
|
|
std::string Name = {};
|
|
bool Weak = false;
|
|
bool ThreadLocalValue = false;
|
|
bool isData = false;
|
|
MachO::TargetList Targets = {};
|
|
};
|
|
|
|
using ExportedSymbolSeq = std::vector<ExportedSymbol>;
|
|
using TargetToAttr = std::vector<std::pair<llvm::MachO::Target, std::string>>;
|
|
using TBDFile = std::unique_ptr<MachO::InterfaceFile>;
|
|
using TBDReexportFile = std::shared_ptr<MachO::InterfaceFile>;
|
|
|
|
inline bool operator<(const ExportedSymbol &LHS, const ExportedSymbol &RHS) {
|
|
return std::tie(LHS.Kind, LHS.Name) < std::tie(RHS.Kind, RHS.Name);
|
|
}
|
|
|
|
inline bool operator==(const ExportedSymbol &LHS, const ExportedSymbol &RHS) {
|
|
return std::tie(LHS.Kind, LHS.Name, LHS.Weak, LHS.ThreadLocalValue) ==
|
|
std::tie(RHS.Kind, RHS.Name, RHS.Weak, RHS.ThreadLocalValue);
|
|
}
|
|
|
|
inline std::string stripWhitespace(std::string S) {
|
|
S.erase(std::remove_if(S.begin(), S.end(), ::isspace), S.end());
|
|
return S;
|
|
}
|
|
|
|
// This will transform a single InterfaceFile then compare against the other
|
|
// InterfaceFile then transform the second InterfaceFile in the same way to
|
|
// regain equality.
|
|
inline bool
|
|
checkEqualityOnTransform(MachO::InterfaceFile &FileA,
|
|
MachO::InterfaceFile &FileB,
|
|
void (*Transform)(MachO::InterfaceFile *)) {
|
|
Transform(&FileA);
|
|
// Files should not be equal.
|
|
if (FileA == FileB)
|
|
return false;
|
|
Transform(&FileB);
|
|
// Files should be equal.
|
|
if (FileA != FileB)
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
} // namespace llvm
|
|
#endif
|