Skip to content

Commit

Permalink
Revert "[dsymutil] Remove support for obfuscated bitcode (#85713)"
Browse files Browse the repository at this point in the history
This reverts commit 43a2ec4.
  • Loading branch information
avillega committed Mar 19, 2024
1 parent fe84369 commit 48ebe1b
Show file tree
Hide file tree
Showing 30 changed files with 555 additions and 28 deletions.
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

0 comments on commit 48ebe1b

Please sign in to comment.