From c9d82b9e16d0f4c81aefd0cbcdfa476ac2c17634 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Thu, 27 Apr 2017 04:01:36 +0000 Subject: [PATCH] Simplify BinaryFile::parse and add comments. llvm-svn: 301514 --- lld/ELF/InputFiles.cpp | 37 ++++++++++++++++++------------------- lld/ELF/Strings.h | 4 ++++ 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index b032dc8f4334..f6ec4dd23f6f 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -883,30 +883,29 @@ static ELFKind getELFKind(MemoryBufferRef MB) { } template void BinaryFile::parse() { - StringRef Buf = MB.getBuffer(); - ArrayRef Data = - makeArrayRef((const uint8_t *)Buf.data(), Buf.size()); - - std::string Filename = MB.getBufferIdentifier(); - std::transform(Filename.begin(), Filename.end(), Filename.begin(), - [](char C) { return isalnum(C) ? C : '_'; }); - Filename = "_binary_" + Filename; - StringRef StartName = Saver.save(Filename + "_start"); - StringRef EndName = Saver.save(Filename + "_end"); - StringRef SizeName = Saver.save(Filename + "_size"); - + ArrayRef Data = toArrayRef(MB.getBuffer()); auto *Section = make(SHF_ALLOC | SHF_WRITE, SHT_PROGBITS, 8, Data, ".data"); Sections.push_back(Section); - elf::Symtab::X->addRegular(StartName, STV_DEFAULT, STT_OBJECT, 0, 0, - STB_GLOBAL, Section, nullptr); - elf::Symtab::X->addRegular(EndName, STV_DEFAULT, STT_OBJECT, - Data.size(), 0, STB_GLOBAL, Section, - nullptr); - elf::Symtab::X->addRegular(SizeName, STV_DEFAULT, STT_OBJECT, - Data.size(), 0, STB_GLOBAL, nullptr, + // For each input file foo that is embedded to a result as a binary + // blob, we define _binary_foo_{start,end,size} symbols, so that + // user programs can access blobs by name. Non-alphanumeric + // characters in a filename are replaced with underscore. + std::string S = "_binary_" + MB.getBufferIdentifier().str(); + for (size_t I = 0; I < S.size(); ++I) + if (!isalnum(S[I])) + S[I] = '_'; + + elf::Symtab::X->addRegular(Saver.save(S + "_start"), STV_DEFAULT, + STT_OBJECT, 0, 0, STB_GLOBAL, Section, nullptr); + elf::Symtab::X->addRegular(Saver.save(S + "_end"), STV_DEFAULT, + STT_OBJECT, Data.size(), 0, STB_GLOBAL, + Section, nullptr); + elf::Symtab::X->addRegular(Saver.save(S + "_size"), STV_DEFAULT, + STT_OBJECT, Data.size(), 0, STB_GLOBAL, + nullptr, nullptr); } static bool isBitcode(MemoryBufferRef MB) { diff --git a/lld/ELF/Strings.h b/lld/ELF/Strings.h index 934b6427105f..bcfa28144989 100644 --- a/lld/ELF/Strings.h +++ b/lld/ELF/Strings.h @@ -76,6 +76,10 @@ llvm::Optional demangle(StringRef Name); inline StringRef toStringRef(ArrayRef Arr) { return {(const char *)Arr.data(), Arr.size()}; } + +inline ArrayRef toArrayRef(StringRef S) { + return {(const uint8_t *)S.data(), S.size()}; +} } }