2019-03-14 18:49:40 -07:00
|
|
|
//===--- ExecutableFileMemoryManager.cpp ----------------------------------===//
|
|
|
|
|
//
|
2021-03-15 18:04:18 -07:00
|
|
|
// 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
|
2019-03-14 18:49:40 -07:00
|
|
|
//
|
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
//
|
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
|
|
#include "ExecutableFileMemoryManager.h"
|
|
|
|
|
#include "RewriteInstance.h"
|
|
|
|
|
|
|
|
|
|
#undef DEBUG_TYPE
|
2019-07-24 14:03:43 -07:00
|
|
|
#define DEBUG_TYPE "efmm"
|
2019-03-14 18:49:40 -07:00
|
|
|
|
|
|
|
|
using namespace llvm;
|
|
|
|
|
using namespace object;
|
|
|
|
|
using namespace bolt;
|
|
|
|
|
|
|
|
|
|
namespace llvm {
|
|
|
|
|
|
|
|
|
|
namespace bolt {
|
|
|
|
|
|
|
|
|
|
uint8_t *ExecutableFileMemoryManager::allocateSection(intptr_t Size,
|
|
|
|
|
unsigned Alignment,
|
|
|
|
|
unsigned SectionID,
|
|
|
|
|
StringRef SectionName,
|
|
|
|
|
bool IsCode,
|
|
|
|
|
bool IsReadOnly) {
|
2019-04-26 15:30:12 -07:00
|
|
|
// Register a debug section as a note section.
|
2019-07-24 14:03:43 -07:00
|
|
|
if (!ObjectsLoaded && RewriteInstance::isDebugSection(SectionName)) {
|
2019-04-26 15:30:12 -07:00
|
|
|
uint8_t *DataCopy = new uint8_t[Size];
|
|
|
|
|
auto &Section = BC.registerOrUpdateNoteSection(SectionName,
|
|
|
|
|
DataCopy,
|
|
|
|
|
Size,
|
|
|
|
|
Alignment);
|
|
|
|
|
Section.setSectionID(SectionID);
|
|
|
|
|
assert(!Section.isAllocatable() && "note sections cannot be allocatable");
|
|
|
|
|
return DataCopy;
|
2019-03-14 18:49:40 -07:00
|
|
|
}
|
|
|
|
|
|
2020-12-01 16:29:39 -08:00
|
|
|
if (!IsCode &&
|
|
|
|
|
(SectionName == ".strtab" ||
|
|
|
|
|
SectionName == ".symtab" ||
|
|
|
|
|
SectionName == "" ||
|
|
|
|
|
SectionName.startswith(".rela."))) {
|
|
|
|
|
return SectionMemoryManager::allocateDataSection(Size, Alignment, SectionID,
|
|
|
|
|
SectionName, IsReadOnly);
|
|
|
|
|
}
|
|
|
|
|
|
2019-03-14 18:49:40 -07:00
|
|
|
uint8_t *Ret;
|
|
|
|
|
if (IsCode) {
|
|
|
|
|
Ret = SectionMemoryManager::allocateCodeSection(Size, Alignment,
|
|
|
|
|
SectionID, SectionName);
|
|
|
|
|
} else {
|
2020-11-17 13:57:29 -08:00
|
|
|
Ret = SectionMemoryManager::allocateDataSection(Size, Alignment, SectionID,
|
|
|
|
|
SectionName, IsReadOnly);
|
2019-03-14 18:49:40 -07:00
|
|
|
}
|
|
|
|
|
|
2019-07-24 14:03:43 -07:00
|
|
|
SmallVector<char, 256> Buf;
|
2020-11-17 13:57:29 -08:00
|
|
|
if (ObjectsLoaded > 0) {
|
|
|
|
|
if (BC.isELF()) {
|
|
|
|
|
SectionName = (Twine(SectionName) + ".bolt.extra." + Twine(ObjectsLoaded))
|
|
|
|
|
.toStringRef(Buf);
|
|
|
|
|
} else if (BC.isMachO()) {
|
|
|
|
|
assert((SectionName == "__text" || SectionName == "__data" ||
|
2020-11-19 18:18:28 -08:00
|
|
|
SectionName == "__fini" || SectionName == "__setup" ||
|
2021-01-28 12:04:46 -08:00
|
|
|
SectionName == "__cstring" || SectionName == "__literal16") &&
|
2020-11-17 13:57:29 -08:00
|
|
|
"Unexpected section in the instrumentation library");
|
2021-01-28 12:04:46 -08:00
|
|
|
// Sections coming from the instrumentation runtime are prefixed with "I".
|
2020-11-17 13:57:29 -08:00
|
|
|
SectionName = ("I" + Twine(SectionName)).toStringRef(Buf);
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-07-24 14:03:43 -07:00
|
|
|
|
2020-11-17 13:57:29 -08:00
|
|
|
auto &Section = BC.registerOrUpdateSection(
|
|
|
|
|
SectionName, ELF::SHT_PROGBITS,
|
|
|
|
|
BinarySection::getFlags(IsReadOnly, IsCode, true), Ret, Size, Alignment);
|
2019-03-14 18:49:40 -07:00
|
|
|
Section.setSectionID(SectionID);
|
|
|
|
|
assert(Section.isAllocatable() &&
|
|
|
|
|
"verify that allocatable is marked as allocatable");
|
|
|
|
|
|
2020-12-01 16:29:39 -08:00
|
|
|
LLVM_DEBUG(
|
|
|
|
|
dbgs() << "BOLT: allocating "
|
|
|
|
|
<< (IsCode ? "code" : (IsReadOnly ? "read-only data" : "data"))
|
|
|
|
|
<< " section : " << SectionName << " with size " << Size
|
|
|
|
|
<< ", alignment " << Alignment << " at 0x" << Ret
|
|
|
|
|
<< ", ID = " << SectionID << "\n");
|
2019-03-14 18:49:40 -07:00
|
|
|
return Ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ExecutableFileMemoryManager::finalizeMemory(std::string *ErrMsg) {
|
2020-12-01 16:29:39 -08:00
|
|
|
LLVM_DEBUG(dbgs() << "BOLT: finalizeMemory()\n");
|
2019-07-24 14:03:43 -07:00
|
|
|
++ObjectsLoaded;
|
2019-03-14 18:49:40 -07:00
|
|
|
return SectionMemoryManager::finalizeMemory(ErrMsg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ExecutableFileMemoryManager::~ExecutableFileMemoryManager() { }
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|