2014-12-12 8 views
6

Czy istnieje sposób (np. Zdefiniowane stałe), aby uzyskać dostęp do flag kompilacji, z którymi kompilator był uruchamiany wewnątrz kodu, który jest kompilowany.g ++: Czy istnieje sposób dostępu do flag kompilacji wewnątrz kodu, który jest kompilowany?

Na przykład chcę programu, który zapisuje flagi, z którymi został skompilowany.

int main(){ 
    std::cout << COMPILE_FLAGS << std::endl; 
} 

Czy takie stałe istnieją dla gcc/g ++? Albo jeszcze lepiej: czy istnieją stałe zdefiniowane zarówno w gcc jak i clang?

Jestem szczególnie zainteresowany badaniem poziomu optymalizacji i wartości flagi -march. Więc jeśli nie ma stałych pokazujących wszystkie flagi, czy są co najmniej te, które wyświetlają te wartości?

+0

Jeśli nic więcej, powinieneś być w stanie zhakować coś razem, używając pliku Makefile, który jednocześnie ustawia flagę optymalizacyjną i zapisuje stałą do pliku nagłówkowego. – Degustaf

+0

Chciałbym spróbować znaleźć to w informacji debugowania, która jest przechowywana z kodem, JEŚLI jest skompilowany z takimi informacjami. Ogólnie rzecz biorąc powiedziałbym, że nie ma mowy, ponieważ kompilujemy się do kodu maszynowego, a w większości przypadków byłoby to całkowicie niepotrzebne informacje w czasie wykonywania. Mam na myśli, że większość flag wpływa na to, które instrukcje maszynowe są wybierane i jakie optymalizacje można wykonać, abyś mógł wydedukować niektóre flagi z samego kodu maszynowego. – midor

Odpowiedz

1

Poniższe polecenie wypisuje wszystkie predefiniowanych makr:

g++ -dM -E - < /dev/null 

ten współpracuje zarówno z gcc i g ++. Możesz sprawdzić sam siebie - niestety nie ma makra, który daje łatwy dostęp do pełnej linii poleceń gcc/g ++.

Na szczęście większość flag -m ... powoduje zdefiniowanie odpowiednich makr prekompilatora. Na przykład, -m64 określa __x86_64 i -m32 określa __code_model_32__. Lub dla -march: -march = core-avx2 wyniki w #define __core_avx2__ 1.

Wystarczy dodać opcję, którą należy sprawdzić w powyższym wierszu poleceń i sprawdzić wynik dla nowych definicji makr.

0

Jeśli jesteś w stanie zmienić flagi kompilacji lub skrypt, który generuje polecenia kompilacji, można dodać -DCOMPILE_FLAGS = < flagi jesteś zainteresowany> do budowy faktycznie stworzyć tę stałą.

Z GCC manual:

-D name = definicja Zawartość definicji są tokenized i przetwarzane tak, jakby pojawiła się podczas fazy translacji trzy w „#define” dyrektywy. W szczególności definicja zostanie obcięta przez osadzone znaki nowej linii.

Powiązane problemy