Index: lit/Expr/Inputs/ir-memory-map-basic.test =================================================================== --- /dev/null +++ lit/Expr/Inputs/ir-memory-map-basic.test @@ -0,0 +1,25 @@ +malloc 0 1 +malloc 1 1 + +malloc 2 1 +malloc 2 2 +malloc 2 4 + +malloc 3 1 +malloc 3 2 +malloc 3 4 + +malloc 128 1 +malloc 128 2 +malloc 128 4 +malloc 128 128 + +malloc 2048 1 +malloc 2048 2 +malloc 2048 4 + +malloc 3968 1 +malloc 3968 2 +malloc 3968 4 + +malloc 0 1 Index: lit/Expr/Inputs/ir-memory-map-overlap1.test =================================================================== --- /dev/null +++ lit/Expr/Inputs/ir-memory-map-overlap1.test @@ -0,0 +1,10 @@ +malloc 8 16 +malloc 16 8 +malloc 64 32 +malloc 1 8 +malloc 64 32 +malloc 64 8 +malloc 1024 32 +malloc 1 16 +malloc 8 16 +malloc 1024 16 \ No newline at end of file Index: lit/Expr/TestIRMemoryMap.test =================================================================== --- lit/Expr/TestIRMemoryMap.test +++ lit/Expr/TestIRMemoryMap.test @@ -1,28 +1,3 @@ # RUN: %cxx %p/Inputs/call-function.cpp -g -o %t -# RUN: lldb-test ir-memory-map %t %s - -malloc 0 1 -malloc 1 1 - -malloc 2 1 -malloc 2 2 -malloc 2 4 - -malloc 3 1 -malloc 3 2 -malloc 3 4 - -malloc 128 1 -malloc 128 2 -malloc 128 4 -malloc 128 128 - -malloc 2048 1 -malloc 2048 2 -malloc 2048 4 - -malloc 3968 1 -malloc 3968 2 -malloc 3968 4 - -malloc 0 1 +# RUN: lldb-test ir-memory-map %t %S/Inputs/ir-memory-map-basic.test +# RUN: lldb-test ir-memory-map %t %S/Inputs/ir-memory-map-overlap1.test Index: source/Expression/IRMemoryMap.cpp =================================================================== --- source/Expression/IRMemoryMap.cpp +++ source/Expression/IRMemoryMap.cpp @@ -304,12 +304,25 @@ size_t alignment_mask = alignment - 1; size_t allocation_size; - if (size == 0) + if (size == 0) { + // FIXME: Malloc(0) should either return an invalid address or assert, in + // order to cut down on unnecessary allocations. allocation_size = alignment; - else - allocation_size = (size & alignment_mask) - ? ((size + alignment) & (~alignment_mask)) - : size; + } else { + // Round up the requested size to an aligned value, if needed. + if (size & alignment_mask) + allocation_size = ((size + alignment) & (~alignment_mask)); + else + allocation_size = size; + + // The process page cache does not see the requested alignment. We can't + // assume its result will be any more than 1-byte aligned. To work around + // this, request `alignment` additional bytes. + // + // FIXME: Pass the requested alignment into the process page cache to + // reduce internal fragmentation. + allocation_size += alignment; + } switch (policy) { default: