wyłączenie optymalizacji dla procedury

0

Jak zmusić kompilator by tą jedyną funkcję potraktował dosłownie... bez optymalizacji kodu.

void function() {
	uint32_t *pointer = (uint32_t *) 0xFEC00000;

	pointer[ 0 ] = 0x20;
	pointer[ 4 ] = 0x28;

	pointer[ 0 ] = 0x21
	pointer[ 4 ] = 0x00;
}

Kompilator wypluwa:

	mov	esi,	0xFEC00000

	mov	dword [esi],	0x21
	and	dword [esi + 0x10],	0x00

a powinien:

	mov	esi,	0xFEC00000

	mov	dword [esi],	0x20
	mov	dword [esi + 0x10],	0x28

	mov	dword [esi],	0x21
	mov	dword [esi + 0x10],	0x00

4

volatile, lub ewentualnie memory barrier w stylu:

asm volatile ("" : : : "memory");
1

Pomogło :)

void function() {
    uint32_t *pointer = (uint32_t *) 0xFEC00000;

    pointer[ 0 ] = 0x20;
    pointer[ 4 ] = 0x28;

    asm volatile ("" : : : "memory");

    pointer[ 0 ] = 0x21
    pointer[ 4 ] = 0x00;
}
2

Jaki kompilator?
W #pragma .... kompilatory ukrywają rożne opcje własne, więc za pomocą tego można zmienić ustawienia kompilatora zależnie od potrzeb.
Najlepiej zajrzeć do dokumentacji.

Inna lepsza metoda, to trzymać tą funkcję w osobnym źródle lub wręcz w osobnej bibliotece, gdzie ustawienia kompilatora będą inne.

Zastanawiam się jednak nad jednym: po co? Wygląda mi to na problem XY.
Najraźniej walczysz z undefined behavior i zamiast je usunąć kombinujesz z kompilatorem.

0

@MarekR22: potwierdzam, działa :)

#pragma clang optimize off
void function() {
    uint32_t *pointer = (uint32_t *) 0xFEC00000;

    pointer[ 0 ] = 0x20;
    pointer[ 4 ] = 0x28;

    pointer[ 0 ] = 0x21
    pointer[ 4 ] = 0x00;
}
#pragma clang optimize on
5

Lepiej tak:

#include <stdint.h>

void function() {
    volatile uint32_t *pointer = (volatile uint32_t *) 0xFEC00000;

    pointer[ 0 ] = 0x20;
    pointer[ 4 ] = 0x28;

    pointer[ 0 ] = 0x21;
    pointer[ 4 ] = 0x00;
}

https://godbolt.org/z/rzf8cdb5b

1 użytkowników online, w tym zalogowanych: 0, gości: 1