Skip to content

Revert "[dsymutil] Remove support for obfuscated bitcode" #85826

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions llvm/docs/CommandGuide/dsymutil.rst
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,10 @@ OPTIONS
(in bytes) to the linked dSYM. The table is sorted by the output size listing
the object files with the largest contribution first.

.. option:: --symbol-map <bcsymbolmap>

Update the existing dSYMs inplace using symbol map specified.

.. option:: -s, --symtab

Dumps the symbol table found in *executable* or object file(s) and exits.
Expand Down
6 changes: 5 additions & 1 deletion llvm/include/llvm/CodeGen/NonRelocatableStringpool.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@ class NonRelocatableStringpool {
/// order.
using MapTy = StringMap<DwarfStringPoolEntry, BumpPtrAllocator>;

NonRelocatableStringpool(bool PutEmptyString = false) {
NonRelocatableStringpool(
std::function<StringRef(StringRef Input)> Translator = nullptr,
bool PutEmptyString = false)
: Translator(Translator) {
if (PutEmptyString)
getEntry("");
}
Expand Down Expand Up @@ -56,6 +59,7 @@ class NonRelocatableStringpool {
MapTy Strings;
uint64_t CurrentEndOffset = 0;
unsigned NumEntries = 0;
std::function<StringRef(StringRef Input)> Translator;
};

/// Helper for making strong types.
Expand Down
8 changes: 6 additions & 2 deletions llvm/include/llvm/DWARFLinker/Classic/DWARFStreamer.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,16 @@ class DwarfStreamer : public DwarfEmitter {
public:
DwarfStreamer(DWARFLinkerBase::OutputFileType OutFileType,
raw_pwrite_stream &OutFile,
DWARFLinkerBase::TranslatorFuncTy Translator,
DWARFLinkerBase::MessageHandlerTy Warning)
: OutFile(OutFile), OutFileType(OutFileType), WarningHandler(Warning) {}
: OutFile(OutFile), OutFileType(OutFileType), Translator(Translator),
WarningHandler(Warning) {}
virtual ~DwarfStreamer() = default;

static Expected<std::unique_ptr<DwarfStreamer>> createStreamer(
const Triple &TheTriple, DWARFLinkerBase::OutputFileType FileType,
raw_pwrite_stream &OutFile, DWARFLinkerBase::MessageHandlerTy Warning);
raw_pwrite_stream &OutFile, DWARFLinkerBase::TranslatorFuncTy Translator,
DWARFLinkerBase::MessageHandlerTy Warning);

Error init(Triple TheTriple, StringRef Swift5ReflectionSegmentName);

Expand Down Expand Up @@ -292,6 +295,7 @@ class DwarfStreamer : public DwarfEmitter {
/// The output file we stream the linked Dwarf to.
raw_pwrite_stream &OutFile;
DWARFLinker::OutputFileType OutFileType = DWARFLinker::OutputFileType::Object;
std::function<StringRef(StringRef Input)> Translator;

uint64_t RangesSectionSize = 0;
uint64_t RngListsSectionSize = 0;
Expand Down
1 change: 1 addition & 0 deletions llvm/include/llvm/DWARFLinker/DWARFLinkerBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ class DWARFLinkerBase {
std::function<void(const DWARFFile &File, llvm::StringRef Output)>;
using ObjectPrefixMapTy = std::map<std::string, std::string>;
using CompileUnitHandlerTy = function_ref<void(const DWARFUnit &Unit)>;
using TranslatorFuncTy = std::function<StringRef(StringRef)>;
using SwiftInterfacesMapTy = std::map<std::string, std::string>;
/// Type of output file.
enum class OutputFileType : uint8_t {
Expand Down
3 changes: 2 additions & 1 deletion llvm/include/llvm/DWARFLinker/Parallel/DWARFLinker.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,8 @@ class DWARFLinker : public DWARFLinkerBase {

/// Creates dwarf linker instance.
static std::unique_ptr<DWARFLinker>
createLinker(MessageHandlerTy ErrorHandler, MessageHandlerTy WarningHandler);
createLinker(MessageHandlerTy ErrorHandler, MessageHandlerTy WarningHandler,
TranslatorFuncTy StringsTranslator = nullptr);

/// Set output DWARF handler. Result of linking DWARF is set of sections
/// containing final debug info. DWARFLinkerBase::link() pass generated
Expand Down
5 changes: 5 additions & 0 deletions llvm/lib/CodeGen/NonRelocatableStringpool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
namespace llvm {

DwarfStringPoolEntryRef NonRelocatableStringpool::getEntry(StringRef S) {
if (Translator)
S = Translator(S);
auto I = Strings.insert({S, DwarfStringPoolEntry()});
auto &Entry = I.first->second;
if (I.second || !Entry.isIndexed()) {
Expand All @@ -26,6 +28,9 @@ DwarfStringPoolEntryRef NonRelocatableStringpool::getEntry(StringRef S) {
StringRef NonRelocatableStringpool::internString(StringRef S) {
DwarfStringPoolEntry Entry{nullptr, 0, DwarfStringPoolEntry::NotIndexed};

if (Translator)
S = Translator(S);

auto InsertResult = Strings.insert({S, Entry});
return InsertResult.first->getKey();
}
Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/DWARFLinker/Classic/DWARFLinker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2701,8 +2701,8 @@ Error DWARFLinker::link() {
// This Dwarf string pool which is used for emission. It must be used
// serially as the order of calling getStringOffset matters for
// reproducibility.
OffsetsStringPool DebugStrPool(true);
OffsetsStringPool DebugLineStrPool(false);
OffsetsStringPool DebugStrPool(StringsTranslator, true);
OffsetsStringPool DebugLineStrPool(StringsTranslator, false);
DebugDieValuePool StringOffsetPool;

// ODR Contexts for the optimize.
Expand Down
12 changes: 7 additions & 5 deletions llvm/lib/DWARFLinker/Classic/DWARFStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,10 @@ using namespace dwarf_linker::classic;

Expected<std::unique_ptr<DwarfStreamer>> DwarfStreamer::createStreamer(
const Triple &TheTriple, DWARFLinkerBase::OutputFileType FileType,
raw_pwrite_stream &OutFile, DWARFLinkerBase::MessageHandlerTy Warning) {
raw_pwrite_stream &OutFile, DWARFLinkerBase::TranslatorFuncTy Translator,
DWARFLinkerBase::MessageHandlerTy Warning) {
std::unique_ptr<DwarfStreamer> Streamer =
std::make_unique<DwarfStreamer>(FileType, OutFile, Warning);
std::make_unique<DwarfStreamer>(FileType, OutFile, Translator, Warning);
if (Error Err = Streamer->init(TheTriple, "__DWARF"))
return std::move(Err);

Expand Down Expand Up @@ -976,10 +977,11 @@ void DwarfStreamer::emitLineTableString(const DWARFDebugLine::Prologue &P,

switch (String.getForm()) {
case dwarf::DW_FORM_string: {
StringRef Str = *StringVal;
Asm->OutStreamer->emitBytes(Str.data());
StringRef TranslatedString =
(Translator) ? Translator(*StringVal) : *StringVal;
Asm->OutStreamer->emitBytes(TranslatedString.data());
Asm->emitInt8(0);
LineSectionSize += Str.size() + 1;
LineSectionSize += TranslatedString.size() + 1;
} break;
case dwarf::DW_FORM_strp:
case dwarf::DW_FORM_line_strp: {
Expand Down
6 changes: 4 additions & 2 deletions llvm/lib/DWARFLinker/Parallel/DWARFLinker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ using namespace dwarf_linker::parallel;

std::unique_ptr<DWARFLinker>
DWARFLinker::createLinker(MessageHandlerTy ErrorHandler,
MessageHandlerTy WarningHandler) {
return std::make_unique<DWARFLinkerImpl>(ErrorHandler, WarningHandler);
MessageHandlerTy WarningHandler,
TranslatorFuncTy StringsTranslator) {
return std::make_unique<DWARFLinkerImpl>(ErrorHandler, WarningHandler,
StringsTranslator);
}
15 changes: 15 additions & 0 deletions llvm/lib/DWARFLinker/Parallel/DWARFLinkerGlobalData.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class DWARFDie;
namespace dwarf_linker {
namespace parallel {

using TranslatorFuncTy = std::function<StringRef(StringRef)>;
using MessageHandlerTy = std::function<void(
const Twine &Warning, StringRef Context, const DWARFDie *DIE)>;

Expand Down Expand Up @@ -94,6 +95,19 @@ class LinkingGlobalData {
/// Returns global string pool.
StringPool &getStringPool() { return Strings; }

/// Set translation function.
void setTranslator(TranslatorFuncTy Translator) {
this->Translator = Translator;
}

/// Translate specified string.
StringRef translateString(StringRef String) {
if (Translator)
return Translator(String);

return String;
}

/// Returns linking options.
const DWARFLinkerOptions &getOptions() const { return Options; }

Expand Down Expand Up @@ -147,6 +161,7 @@ class LinkingGlobalData {
protected:
llvm::parallel::PerThreadBumpPtrAllocator Allocator;
StringPool Strings;
TranslatorFuncTy Translator;
DWARFLinkerOptions Options;
MessageHandlerTy WarningHandler;
MessageHandlerTy ErrorHandler;
Expand Down
4 changes: 3 additions & 1 deletion llvm/lib/DWARFLinker/Parallel/DWARFLinkerImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,11 @@ using namespace dwarf_linker;
using namespace dwarf_linker::parallel;

DWARFLinkerImpl::DWARFLinkerImpl(MessageHandlerTy ErrorHandler,
MessageHandlerTy WarningHandler)
MessageHandlerTy WarningHandler,
TranslatorFuncTy StringsTranslator)
: UniqueUnitID(0), DebugStrStrings(GlobalData),
DebugLineStrStrings(GlobalData), CommonSections(GlobalData) {
GlobalData.setTranslator(StringsTranslator);
GlobalData.setErrorHandler(ErrorHandler);
GlobalData.setWarningHandler(WarningHandler);
}
Expand Down
3 changes: 2 additions & 1 deletion llvm/lib/DWARFLinker/Parallel/DWARFLinkerImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ namespace parallel {
class DWARFLinkerImpl : public DWARFLinker {
public:
DWARFLinkerImpl(MessageHandlerTy ErrorHandler,
MessageHandlerTy WarningHandler);
MessageHandlerTy WarningHandler,
TranslatorFuncTy StringsTranslator);

/// Add object file to be linked. Pre-load compile unit die. Call
/// \p OnCUDieLoaded for each compile unit die. If specified \p File
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/DWARFLinker/Parallel/OutputSections.h
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ struct SectionDescriptor : SectionDescriptorBase {

/// Emit specified inplace string value into the current section contents.
void emitInplaceString(StringRef String) {
OS << String;
OS << GlobalData.translateString(String);
emitIntVal(0, 1);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class StringEntryToDwarfStringPoolEntryMap {
DwarfStringPoolEntryWithExtString *DataPtr =
GlobalData.getAllocator()
.Allocate<DwarfStringPoolEntryWithExtString>();
DataPtr->String = String->getKey();
DataPtr->String = GlobalData.translateString(String->getKey());
DataPtr->Index = DwarfStringPoolEntry::NotIndexed;
DataPtr->Offset = 0;
DataPtr->Symbol = nullptr;
Expand Down
Loading