forked from OSchip/llvm-project
[RuntimeDyld] Always allocate at least 1 byte for object sections in the JIT to
ensure that section addresses are distinct. mapSectionAddress will fail if two sections are allocated the same address, which can happen if any section has zero size (since malloc(0) is implementation defined). Unfortunately I've been unable to repro this with a simple test case. Fixes <rdar://problem/20314015>. llvm-svn: 234299
This commit is contained in:
parent
ed96cb7fc6
commit
2be1bbea7e
|
@ -361,19 +361,20 @@ void RuntimeDyldImpl::computeTotalAllocSize(const ObjectFile &Obj,
|
|||
if (Name == ".eh_frame")
|
||||
SectionSize += 4;
|
||||
|
||||
if (SectionSize > 0) {
|
||||
// save the total size of the section
|
||||
if (IsCode) {
|
||||
CodeSectionSizes.push_back(SectionSize);
|
||||
} else if (IsReadOnly) {
|
||||
ROSectionSizes.push_back(SectionSize);
|
||||
} else {
|
||||
RWSectionSizes.push_back(SectionSize);
|
||||
}
|
||||
// update the max alignment
|
||||
if (Alignment > MaxAlignment) {
|
||||
MaxAlignment = Alignment;
|
||||
}
|
||||
if (!SectionSize)
|
||||
SectionSize = 1;
|
||||
|
||||
if (IsCode) {
|
||||
CodeSectionSizes.push_back(SectionSize);
|
||||
} else if (IsReadOnly) {
|
||||
ROSectionSizes.push_back(SectionSize);
|
||||
} else {
|
||||
RWSectionSizes.push_back(SectionSize);
|
||||
}
|
||||
|
||||
// update the max alignment
|
||||
if (Alignment > MaxAlignment) {
|
||||
MaxAlignment = Alignment;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -578,6 +579,8 @@ unsigned RuntimeDyldImpl::emitSection(const ObjectFile &Obj,
|
|||
if (IsRequired) {
|
||||
Check(Section.getContents(data));
|
||||
Allocate = DataSize + PaddingSize + StubBufSize;
|
||||
if (!Allocate)
|
||||
Allocate = 1;
|
||||
Addr = IsCode ? MemMgr.allocateCodeSection(Allocate, Alignment, SectionID,
|
||||
Name)
|
||||
: MemMgr.allocateDataSection(Allocate, Alignment, SectionID,
|
||||
|
|
Loading…
Reference in New Issue