summaryrefslogtreecommitdiff
path: root/tools/lli
diff options
context:
space:
mode:
authorAndrew Kaylor <andrew.kaylor@intel.com>2013-10-04 20:09:36 +0000
committerAndrew Kaylor <andrew.kaylor@intel.com>2013-10-04 20:09:36 +0000
commite3fd646e178f92dbe2737a5230d73577090d9d0e (patch)
treeeab222ddc60bc651b47b9ce037b56afdbe5362a9 /tools/lli
parente7099f6ff48ee99e50aa8347b455255e3a893a12 (diff)
downloadllvm-e3fd646e178f92dbe2737a5230d73577090d9d0e.tar.gz
llvm-e3fd646e178f92dbe2737a5230d73577090d9d0e.tar.bz2
llvm-e3fd646e178f92dbe2737a5230d73577090d9d0e.tar.xz
Fixing container/pointer bug in remote-lli found by ASan
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191976 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/lli')
-rw-r--r--tools/lli/RemoteMemoryManager.cpp52
-rw-r--r--tools/lli/RemoteMemoryManager.h5
2 files changed, 29 insertions, 28 deletions
diff --git a/tools/lli/RemoteMemoryManager.cpp b/tools/lli/RemoteMemoryManager.cpp
index 1f86066051..afc804d63d 100644
--- a/tools/lli/RemoteMemoryManager.cpp
+++ b/tools/lli/RemoteMemoryManager.cpp
@@ -36,8 +36,10 @@ allocateCodeSection(uintptr_t Size, unsigned Alignment, unsigned SectionID,
// heap storage is sufficient here, but we're using mapped memory to work
// around a bug in MCJIT.
sys::MemoryBlock Block = allocateSection(Size);
+ // AllocatedSections will own this memory.
AllocatedSections.push_back( Allocation(Block, Alignment, true) );
- UnmappedSections.push_back( &AllocatedSections.back() );
+ // UnmappedSections has the same information but does not own the memory.
+ UnmappedSections.push_back( Allocation(Block, Alignment, true) );
return (uint8_t*)Block.base();
}
@@ -50,8 +52,10 @@ allocateDataSection(uintptr_t Size, unsigned Alignment,
// heap storage is sufficient here, but we're using mapped memory to work
// around a bug in MCJIT.
sys::MemoryBlock Block = allocateSection(Size);
+ // AllocatedSections will own this memory.
AllocatedSections.push_back( Allocation(Block, Alignment, false) );
- UnmappedSections.push_back( &AllocatedSections.back() );
+ // UnmappedSections has the same information but does not own the memory.
+ UnmappedSections.push_back( Allocation(Block, Alignment, false) );
return (uint8_t*)Block.base();
}
@@ -86,43 +90,39 @@ void RemoteMemoryManager::notifyObjectLoaded(ExecutionEngine *EE,
// all the data sections.
uint64_t CurOffset = 0;
unsigned MaxAlign = Target->getPageAlignment();
- SmallVector<std::pair<const Allocation*, uint64_t>, 16> Offsets;
+ SmallVector<std::pair<Allocation&, uint64_t>, 16> Offsets;
unsigned NumSections = UnmappedSections.size();
// We're going to go through the list twice to separate code and data, but
// it's a very small list, so that's OK.
for (size_t i = 0, e = NumSections; i != e; ++i) {
- const Allocation *Section = UnmappedSections[i];
- assert(Section);
- if (Section->IsCode) {
- unsigned Size = Section->MB.size();
- unsigned Align = Section->Alignment;
+ Allocation &Section = UnmappedSections[i];
+ if (Section.IsCode) {
+ unsigned Size = Section.MB.size();
+ unsigned Align = Section.Alignment;
DEBUG(dbgs() << "code region: size " << Size
<< ", alignment " << Align << "\n");
// Align the current offset up to whatever is needed for the next
// section.
CurOffset = (CurOffset + Align - 1) / Align * Align;
// Save off the address of the new section and allocate its space.
- Offsets.push_back(std::pair<const Allocation*,uint64_t>(Section,
- CurOffset));
+ Offsets.push_back(std::pair<Allocation&,uint64_t>(Section, CurOffset));
CurOffset += Size;
}
}
// Adjust to keep code and data aligned on seperate pages.
CurOffset = (CurOffset + MaxAlign - 1) / MaxAlign * MaxAlign;
for (size_t i = 0, e = NumSections; i != e; ++i) {
- const Allocation *Section = UnmappedSections[i];
- assert(Section);
- if (!Section->IsCode) {
- unsigned Size = Section->MB.size();
- unsigned Align = Section->Alignment;
+ Allocation &Section = UnmappedSections[i];
+ if (!Section.IsCode) {
+ unsigned Size = Section.MB.size();
+ unsigned Align = Section.Alignment;
DEBUG(dbgs() << "data region: size " << Size
<< ", alignment " << Align << "\n");
// Align the current offset up to whatever is needed for the next
// section.
CurOffset = (CurOffset + Align - 1) / Align * Align;
// Save off the address of the new section and allocate its space.
- Offsets.push_back(std::pair<const Allocation*,uint64_t>(Section,
- CurOffset));
+ Offsets.push_back(std::pair<Allocation&,uint64_t>(Section, CurOffset));
CurOffset += Size;
}
}
@@ -136,9 +136,9 @@ void RemoteMemoryManager::notifyObjectLoaded(ExecutionEngine *EE,
// copies of the sections.
for (unsigned i = 0, e = Offsets.size(); i != e; ++i) {
uint64_t Addr = RemoteAddr + Offsets[i].second;
- EE->mapSectionAddress(const_cast<void*>(Offsets[i].first->MB.base()), Addr);
+ EE->mapSectionAddress(const_cast<void*>(Offsets[i].first.MB.base()), Addr);
- DEBUG(dbgs() << " Mapping local: " << Offsets[i].first->MB.base()
+ DEBUG(dbgs() << " Mapping local: " << Offsets[i].first.MB.base()
<< " to remote: 0x" << format("%llx", Addr) << "\n");
MappedSections[Addr] = Offsets[i].first;
@@ -149,20 +149,20 @@ void RemoteMemoryManager::notifyObjectLoaded(ExecutionEngine *EE,
bool RemoteMemoryManager::finalizeMemory(std::string *ErrMsg) {
// FIXME: Make this function thread safe.
- for (DenseMap<uint64_t, const Allocation*>::iterator
+ for (DenseMap<uint64_t, Allocation>::iterator
I = MappedSections.begin(), E = MappedSections.end();
I != E; ++I) {
uint64_t RemoteAddr = I->first;
- const Allocation *Section = I->second;
- if (Section->IsCode) {
- Target->loadCode(RemoteAddr, Section->MB.base(), Section->MB.size());
+ const Allocation &Section = I->second;
+ if (Section.IsCode) {
+ Target->loadCode(RemoteAddr, Section.MB.base(), Section.MB.size());
- DEBUG(dbgs() << " loading code: " << Section->MB.base()
+ DEBUG(dbgs() << " loading code: " << Section.MB.base()
<< " to remote: 0x" << format("%llx", RemoteAddr) << "\n");
} else {
- Target->loadData(RemoteAddr, Section->MB.base(), Section->MB.size());
+ Target->loadData(RemoteAddr, Section.MB.base(), Section.MB.size());
- DEBUG(dbgs() << " loading data: " << Section->MB.base()
+ DEBUG(dbgs() << " loading data: " << Section.MB.base()
<< " to remote: 0x" << format("%llx", RemoteAddr) << "\n");
}
}
diff --git a/tools/lli/RemoteMemoryManager.h b/tools/lli/RemoteMemoryManager.h
index dc74666672..ca157a7929 100644
--- a/tools/lli/RemoteMemoryManager.h
+++ b/tools/lli/RemoteMemoryManager.h
@@ -30,6 +30,7 @@ class RemoteMemoryManager : public JITMemoryManager {
public:
// Notice that this structure takes ownership of the memory allocated.
struct Allocation {
+ Allocation() {}
Allocation(sys::MemoryBlock mb, unsigned a, bool code)
: MB(mb), Alignment(a), IsCode(code) {}
@@ -48,11 +49,11 @@ private:
// have allocated locally but have not yet remapped for the remote target.
// When we receive notification of a completed module load, we will map
// these sections into the remote target.
- SmallVector<const Allocation *, 2> UnmappedSections;
+ SmallVector<Allocation, 2> UnmappedSections;
// This map tracks the sections we have remapped for the remote target
// but have not yet copied to the target.
- DenseMap<uint64_t, const Allocation *> MappedSections;
+ DenseMap<uint64_t, Allocation> MappedSections;
// FIXME: This is part of a work around to keep sections near one another
// when MCJIT performs relocations after code emission but before