From 8cd2aa3aa4d99f1fc6a0127426b2fb6586a454a3 Mon Sep 17 00:00:00 2001 From: Gabriel Corona Date: Fri, 20 Jun 2014 14:02:05 +0200 Subject: [PATCH 1/1] [mc] Always inline 'inline' functions The MC is usually compiled without optimisation as they tend to confuse the state comparison. But we *really* want to inline functions declared 'inline'. --- src/mc/mc_mmu.h | 17 +++++++++++------ src/mc/mc_page_snapshot.cpp | 3 ++- src/mc/mc_page_store.cpp | 3 ++- src/mc/mc_private.h | 12 ++++++++---- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/mc/mc_mmu.h b/src/mc/mc_mmu.h index 0fe1715307..7f601c1f25 100644 --- a/src/mc/mc_mmu.h +++ b/src/mc/mc_mmu.h @@ -17,7 +17,8 @@ * @param size Byte size * @return Number of memory pages */ -static inline size_t mc_page_count(size_t size) +static inline __attribute__ ((always_inline)) +size_t mc_page_count(size_t size) { size_t page_count = size >> xbt_pagebits; if (size & (xbt_pagesize-1)) { @@ -31,7 +32,8 @@ static inline size_t mc_page_count(size_t size) * @param address Address * @return Virtual memory page number of the given address */ -static inline size_t mc_page_number(void* base, void* address) +static inline __attribute__ ((always_inline)) +size_t mc_page_number(void* base, void* address) { xbt_assert(address>=base, "The address is not in the range"); return ((uintptr_t) address - (uintptr_t) base) >> xbt_pagebits; @@ -42,7 +44,8 @@ static inline size_t mc_page_number(void* base, void* address) * @param address Address * @return Offset within the memory page */ -static inline size_t mc_page_offset(void* address) +static inline __attribute__ ((always_inline)) +size_t mc_page_offset(void* address) { return ((uintptr_t) address) & (xbt_pagesize-1); } @@ -52,14 +55,16 @@ static inline size_t mc_page_offset(void* address) * @param base Address of the first page * @param page Index of the page */ -static inline void* mc_page_from_number(void* base, size_t page) +static inline __attribute__ ((always_inline)) +void* mc_page_from_number(void* base, size_t page) { return (void*) ((char*)base + (page << xbt_pagebits)); } -static inline bool mc_same_page(void* a, void* b) +static inline __attribute__ ((always_inline)) +bool mc_same_page(void* a, void* b) { - return mc_page_number(NULL, a) == mc_page_number(NULL, b); + return ((uintptr_t) a >> xbt_pagebits) == ((uintptr_t) b >> xbt_pagebits); } #endif diff --git a/src/mc/mc_page_snapshot.cpp b/src/mc/mc_page_snapshot.cpp index 2b905c0aee..58ea9e7393 100644 --- a/src/mc/mc_page_snapshot.cpp +++ b/src/mc/mc_page_snapshot.cpp @@ -105,7 +105,8 @@ static size_t pread_whole(int fd, void* buf, size_t count, off_t offset) { return res; } -static inline void mc_ensure_fd(int* fd, const char* path, int flags) { +static inline __attribute__ ((always_inline)) +void mc_ensure_fd(int* fd, const char* path, int flags) { if (*fd != -1) return; *fd = open(path, flags); diff --git a/src/mc/mc_page_store.cpp b/src/mc/mc_page_store.cpp index 467ade6905..85ef6a72f5 100644 --- a/src/mc/mc_page_store.cpp +++ b/src/mc/mc_page_store.cpp @@ -34,7 +34,8 @@ static void mc_read_pagemap(uint64_t* pagemap, size_t page_start, size_t page_co * @param data Memory page * @return hash off the page */ -static inline uint64_t mc_hash_page(const void* data) +static inline __attribute__ ((always_inline)) +uint64_t mc_hash_page(const void* data) { const uint64_t* values = (const uint64_t*) data; size_t n = xbt_pagesize / sizeof(uint64_t); diff --git a/src/mc/mc_private.h b/src/mc/mc_private.h index cdf0571c25..0a3883c3e9 100644 --- a/src/mc/mc_private.h +++ b/src/mc/mc_private.h @@ -49,7 +49,8 @@ typedef struct s_mc_mem_region{ size_t* page_numbers; } s_mc_mem_region_t, *mc_mem_region_t; -static inline bool mc_region_contain(mc_mem_region_t region, void* p) +static inline __attribute__ ((always_inline)) +bool mc_region_contain(mc_mem_region_t region, void* p) { return p >= region->start_addr && p < (void*)((char*) region->start_addr + region->size); @@ -81,7 +82,8 @@ typedef struct s_mc_snapshot{ mc_mem_region_t mc_get_snapshot_region(void* addr, mc_snapshot_t snapshot); -static inline mc_mem_region_t mc_get_region_hinted(void* addr, mc_snapshot_t snapshot, mc_mem_region_t region) +static inline __attribute__ ((always_inline)) +mc_mem_region_t mc_get_region_hinted(void* addr, mc_snapshot_t snapshot, mc_mem_region_t region) { if (mc_region_contain(region, addr)) return region; @@ -672,14 +674,16 @@ uint64_t mc_hash_processes_state(int num_state, xbt_dynar_t stacks); // -inline static void* mc_snapshot_get_heap_end(mc_snapshot_t snapshot) { +static inline __attribute__ ((always_inline)) + void* mc_snapshot_get_heap_end(mc_snapshot_t snapshot) { if(snapshot==NULL) xbt_die("snapshot is NULL"); void** addr = &((xbt_mheap_t)std_heap)->breakval; return mc_snapshot_read_pointer(addr, snapshot); } -static inline void* mc_snapshot_read_pointer(void* addr, mc_snapshot_t snapshot) +static inline __attribute__ ((always_inline)) +void* mc_snapshot_read_pointer(void* addr, mc_snapshot_t snapshot) { void* res; return *(void**) mc_snapshot_read(addr, snapshot, &res, sizeof(void*)); -- 2.20.1