1
0
mirror of https://github.com/google/cpu_features.git synced 2025-04-28 07:23:37 +02:00

Making sure global variable is aligned without using attributes

This commit is contained in:
Guillaume Chatelet 2019-11-12 17:12:44 +01:00
parent 7298eda2ff
commit 9d2de7fb5c

View File

@ -50,7 +50,7 @@ typedef struct {
size_t size; size_t size;
} BumpAllocator; } BumpAllocator;
__attribute__((aligned(8))) char gGlobalBuffer[64 * 1024]; char gGlobalBuffer[64 * 1024];
BumpAllocator gBumpAllocator = {.ptr = gGlobalBuffer, BumpAllocator gBumpAllocator = {.ptr = gGlobalBuffer,
.size = sizeof(gGlobalBuffer)}; .size = sizeof(gGlobalBuffer)};
@ -59,14 +59,29 @@ static void internal_error() {
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
#define ALIGN 8
static void assertAligned() {
if ((uintptr_t)(gBumpAllocator.ptr) % ALIGN) internal_error();
}
static void BA_Align() {
while (gBumpAllocator.size && (uintptr_t)(gBumpAllocator.ptr) % ALIGN) {
--gBumpAllocator.size;
++gBumpAllocator.ptr;
}
assertAligned();
}
// Update the available memory left in the BumpAllocator. // Update the available memory left in the BumpAllocator.
static void* BA_Bump(size_t size) { static void* BA_Bump(size_t size) {
size = (size + 8 - 1) / 8 * 8; // Align size to next 8B boundary. assertAligned();
// Align size to next 8B boundary.
size = (size + ALIGN - 1) / ALIGN * ALIGN;
if (gBumpAllocator.size < size) internal_error(); if (gBumpAllocator.size < size) internal_error();
void* ptr = gBumpAllocator.ptr; void* ptr = gBumpAllocator.ptr;
gBumpAllocator.size -= size; gBumpAllocator.size -= size;
gBumpAllocator.ptr += size; gBumpAllocator.ptr += size;
assert((uintptr_t)(ptr) % 8 == 0 && "memory must be aligned");
return ptr; return ptr;
} }
@ -351,6 +366,7 @@ static Node* CreateTree() {
} }
int main(int argc, char** argv) { int main(int argc, char** argv) {
BA_Align();
const Node* const root = CreateTree(&gBumpAllocator); const Node* const root = CreateTree(&gBumpAllocator);
bool outputJson = false; bool outputJson = false;
int i = 1; int i = 1;