Skip to content

Commit 48ebe1b

Browse files
authored
Revert "[dsymutil] Remove support for obfuscated bitcode (#85713)"
This reverts commit 43a2ec4.
1 parent fe84369 commit 48ebe1b

30 files changed

+555
-28
lines changed

llvm/docs/CommandGuide/dsymutil.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,10 @@ OPTIONS
140140
(in bytes) to the linked dSYM. The table is sorted by the output size listing
141141
the object files with the largest contribution first.
142142

143+
.. option:: --symbol-map <bcsymbolmap>
144+
145+
Update the existing dSYMs inplace using symbol map specified.
146+
143147
.. option:: -s, --symtab
144148

145149
Dumps the symbol table found in *executable* or object file(s) and exits.

llvm/include/llvm/CodeGen/NonRelocatableStringpool.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@ class NonRelocatableStringpool {
2727
/// order.
2828
using MapTy = StringMap<DwarfStringPoolEntry, BumpPtrAllocator>;
2929

30-
NonRelocatableStringpool(bool PutEmptyString = false) {
30+
NonRelocatableStringpool(
31+
std::function<StringRef(StringRef Input)> Translator = nullptr,
32+
bool PutEmptyString = false)
33+
: Translator(Translator) {
3134
if (PutEmptyString)
3235
getEntry("");
3336
}
@@ -56,6 +59,7 @@ class NonRelocatableStringpool {
5659
MapTy Strings;
5760
uint64_t CurrentEndOffset = 0;
5861
unsigned NumEntries = 0;
62+
std::function<StringRef(StringRef Input)> Translator;
5963
};
6064

6165
/// Helper for making strong types.

llvm/include/llvm/DWARFLinker/Classic/DWARFStreamer.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,16 @@ class DwarfStreamer : public DwarfEmitter {
4545
public:
4646
DwarfStreamer(DWARFLinkerBase::OutputFileType OutFileType,
4747
raw_pwrite_stream &OutFile,
48+
DWARFLinkerBase::TranslatorFuncTy Translator,
4849
DWARFLinkerBase::MessageHandlerTy Warning)
49-
: OutFile(OutFile), OutFileType(OutFileType), WarningHandler(Warning) {}
50+
: OutFile(OutFile), OutFileType(OutFileType), Translator(Translator),
51+
WarningHandler(Warning) {}
5052
virtual ~DwarfStreamer() = default;
5153

5254
static Expected<std::unique_ptr<DwarfStreamer>> createStreamer(
5355
const Triple &TheTriple, DWARFLinkerBase::OutputFileType FileType,
54-
raw_pwrite_stream &OutFile, DWARFLinkerBase::MessageHandlerTy Warning);
56+
raw_pwrite_stream &OutFile, DWARFLinkerBase::TranslatorFuncTy Translator,
57+
DWARFLinkerBase::MessageHandlerTy Warning);
5558

5659
Error init(Triple TheTriple, StringRef Swift5ReflectionSegmentName);
5760

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

296300
uint64_t RangesSectionSize = 0;
297301
uint64_t RngListsSectionSize = 0;

llvm/include/llvm/DWARFLinker/DWARFLinkerBase.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class DWARFLinkerBase {
8282
std::function<void(const DWARFFile &File, llvm::StringRef Output)>;
8383
using ObjectPrefixMapTy = std::map<std::string, std::string>;
8484
using CompileUnitHandlerTy = function_ref<void(const DWARFUnit &Unit)>;
85+
using TranslatorFuncTy = std::function<StringRef(StringRef)>;
8586
using SwiftInterfacesMapTy = std::map<std::string, std::string>;
8687
/// Type of output file.
8788
enum class OutputFileType : uint8_t {

llvm/include/llvm/DWARFLinker/Parallel/DWARFLinker.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,8 @@ class DWARFLinker : public DWARFLinkerBase {
123123

124124
/// Creates dwarf linker instance.
125125
static std::unique_ptr<DWARFLinker>
126-
createLinker(MessageHandlerTy ErrorHandler, MessageHandlerTy WarningHandler);
126+
createLinker(MessageHandlerTy ErrorHandler, MessageHandlerTy WarningHandler,
127+
TranslatorFuncTy StringsTranslator = nullptr);
127128

128129
/// Set output DWARF handler. Result of linking DWARF is set of sections
129130
/// containing final debug info. DWARFLinkerBase::link() pass generated

llvm/lib/CodeGen/NonRelocatableStringpool.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
namespace llvm {
1313

1414
DwarfStringPoolEntryRef NonRelocatableStringpool::getEntry(StringRef S) {
15+
if (Translator)
16+
S = Translator(S);
1517
auto I = Strings.insert({S, DwarfStringPoolEntry()});
1618
auto &Entry = I.first->second;
1719
if (I.second || !Entry.isIndexed()) {
@@ -26,6 +28,9 @@ DwarfStringPoolEntryRef NonRelocatableStringpool::getEntry(StringRef S) {
2628
StringRef NonRelocatableStringpool::internString(StringRef S) {
2729
DwarfStringPoolEntry Entry{nullptr, 0, DwarfStringPoolEntry::NotIndexed};
2830

31+
if (Translator)
32+
S = Translator(S);
33+
2934
auto InsertResult = Strings.insert({S, Entry});
3035
return InsertResult.first->getKey();
3136
}

llvm/lib/DWARFLinker/Classic/DWARFLinker.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2701,8 +2701,8 @@ Error DWARFLinker::link() {
27012701
// This Dwarf string pool which is used for emission. It must be used
27022702
// serially as the order of calling getStringOffset matters for
27032703
// reproducibility.
2704-
OffsetsStringPool DebugStrPool(true);
2705-
OffsetsStringPool DebugLineStrPool(false);
2704+
OffsetsStringPool DebugStrPool(StringsTranslator, true);
2705+
OffsetsStringPool DebugLineStrPool(StringsTranslator, false);
27062706
DebugDieValuePool StringOffsetPool;
27072707

27082708
// ODR Contexts for the optimize.

llvm/lib/DWARFLinker/Classic/DWARFStreamer.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,10 @@ using namespace dwarf_linker::classic;
3232

3333
Expected<std::unique_ptr<DwarfStreamer>> DwarfStreamer::createStreamer(
3434
const Triple &TheTriple, DWARFLinkerBase::OutputFileType FileType,
35-
raw_pwrite_stream &OutFile, DWARFLinkerBase::MessageHandlerTy Warning) {
35+
raw_pwrite_stream &OutFile, DWARFLinkerBase::TranslatorFuncTy Translator,
36+
DWARFLinkerBase::MessageHandlerTy Warning) {
3637
std::unique_ptr<DwarfStreamer> Streamer =
37-
std::make_unique<DwarfStreamer>(FileType, OutFile, Warning);
38+
std::make_unique<DwarfStreamer>(FileType, OutFile, Translator, Warning);
3839
if (Error Err = Streamer->init(TheTriple, "__DWARF"))
3940
return std::move(Err);
4041

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

977978
switch (String.getForm()) {
978979
case dwarf::DW_FORM_string: {
979-
StringRef Str = *StringVal;
980-
Asm->OutStreamer->emitBytes(Str.data());
980+
StringRef TranslatedString =
981+
(Translator) ? Translator(*StringVal) : *StringVal;
982+
Asm->OutStreamer->emitBytes(TranslatedString.data());
981983
Asm->emitInt8(0);
982-
LineSectionSize += Str.size() + 1;
984+
LineSectionSize += TranslatedString.size() + 1;
983985
} break;
984986
case dwarf::DW_FORM_strp:
985987
case dwarf::DW_FORM_line_strp: {

llvm/lib/DWARFLinker/Parallel/DWARFLinker.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ using namespace dwarf_linker::parallel;
1515

1616
std::unique_ptr<DWARFLinker>
1717
DWARFLinker::createLinker(MessageHandlerTy ErrorHandler,
18-
MessageHandlerTy WarningHandler) {
19-
return std::make_unique<DWARFLinkerImpl>(ErrorHandler, WarningHandler);
18+
MessageHandlerTy WarningHandler,
19+
TranslatorFuncTy StringsTranslator) {
20+
return std::make_unique<DWARFLinkerImpl>(ErrorHandler, WarningHandler,
21+
StringsTranslator);
2022
}

llvm/lib/DWARFLinker/Parallel/DWARFLinkerGlobalData.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class DWARFDie;
2121
namespace dwarf_linker {
2222
namespace parallel {
2323

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

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

98+
/// Set translation function.
99+
void setTranslator(TranslatorFuncTy Translator) {
100+
this->Translator = Translator;
101+
}
102+
103+
/// Translate specified string.
104+
StringRef translateString(StringRef String) {
105+
if (Translator)
106+
return Translator(String);
107+
108+
return String;
109+
}
110+
97111
/// Returns linking options.
98112
const DWARFLinkerOptions &getOptions() const { return Options; }
99113

@@ -147,6 +161,7 @@ class LinkingGlobalData {
147161
protected:
148162
llvm::parallel::PerThreadBumpPtrAllocator Allocator;
149163
StringPool Strings;
164+
TranslatorFuncTy Translator;
150165
DWARFLinkerOptions Options;
151166
MessageHandlerTy WarningHandler;
152167
MessageHandlerTy ErrorHandler;

llvm/lib/DWARFLinker/Parallel/DWARFLinkerImpl.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@ using namespace dwarf_linker;
2020
using namespace dwarf_linker::parallel;
2121

2222
DWARFLinkerImpl::DWARFLinkerImpl(MessageHandlerTy ErrorHandler,
23-
MessageHandlerTy WarningHandler)
23+
MessageHandlerTy WarningHandler,
24+
TranslatorFuncTy StringsTranslator)
2425
: UniqueUnitID(0), DebugStrStrings(GlobalData),
2526
DebugLineStrStrings(GlobalData), CommonSections(GlobalData) {
27+
GlobalData.setTranslator(StringsTranslator);
2628
GlobalData.setErrorHandler(ErrorHandler);
2729
GlobalData.setWarningHandler(WarningHandler);
2830
}

llvm/lib/DWARFLinker/Parallel/DWARFLinkerImpl.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ namespace parallel {
2626
class DWARFLinkerImpl : public DWARFLinker {
2727
public:
2828
DWARFLinkerImpl(MessageHandlerTy ErrorHandler,
29-
MessageHandlerTy WarningHandler);
29+
MessageHandlerTy WarningHandler,
30+
TranslatorFuncTy StringsTranslator);
3031

3132
/// Add object file to be linked. Pre-load compile unit die. Call
3233
/// \p OnCUDieLoaded for each compile unit die. If specified \p File

llvm/lib/DWARFLinker/Parallel/OutputSections.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ struct SectionDescriptor : SectionDescriptorBase {
253253

254254
/// Emit specified inplace string value into the current section contents.
255255
void emitInplaceString(StringRef String) {
256-
OS << String;
256+
OS << GlobalData.translateString(String);
257257
emitIntVal(0, 1);
258258
}
259259

llvm/lib/DWARFLinker/Parallel/StringEntryToDwarfStringPoolEntryMap.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class StringEntryToDwarfStringPoolEntryMap {
3333
DwarfStringPoolEntryWithExtString *DataPtr =
3434
GlobalData.getAllocator()
3535
.Allocate<DwarfStringPoolEntryWithExtString>();
36-
DataPtr->String = String->getKey();
36+
DataPtr->String = GlobalData.translateString(String->getKey());
3737
DataPtr->Index = DwarfStringPoolEntry::NotIndexed;
3838
DataPtr->Offset = 0;
3939
DataPtr->Symbol = nullptr;

0 commit comments

Comments
 (0)