kategorie: ANSI C, Asembler, C++
[#1] gcc - pytania
W tym wątku rozpoczynam pytania związane z gcc.

Zgapiłem sobie od Kraszana makefile z jego gry Untangle. I jest tam takie cudo, którego nie rozumiem.

-DUSE_INLINE_STDARG


Sama opcja -D jest mi znana ale nie kojarzę USE_INLINE_STDARGS. Co to jest ? Z czym to się je.
1
[#2] Re: gcc - pytania

@asman, post #1

Wygląda na dyrektywę preprocesora związaną z bibliotekami amigowymi. Zapewne w ich na główkach jest potem
#ifdef USE_INLINE_STDARGS
... 
#endif

To nie jest jakiś ficzer stricte gcc.
[wyróżniony] [#3] Re: gcc - pytania

@asman, post #1

Teraz już z niczym... To artefakt jaki mi pozostał z używania starych inkludów systemowych, które nie miały wsparcia dla GCC i brakujące pliki generowało się narzędziem fd2pragma. Jeżeli się nie zdefiniowało tej stałej, to nie były definiowane makra do systemowych funkcji przyjmujących zmienną ilość argumentów. Czyli np. nie było definiowane OpenWindowTags(), tylko OpenWindowTagList(). W aktualnym NDK 3.2 nie ma już w ogóle tej stałej, tam jest odwrotnie, makra zmiennoargumentowe domyślnie są generowane, a jeżeli nie chcemy, żeby były, trzeba zdefiniować NO_INLINE_STDARG.

Z makefile od Untangle można więc to -D wyrzucić i zbudowany kod niczym się nie róźni.

Ostatnia aktualizacja: 12.10.2024 16:22:58 przez Krashan
5
[#4] Re: gcc - pytania

@Krashan, post #3

Dzięki Wielkie.

Mam koleje pytania: Czy idzie nauczyć objdump żeby wypluł mnemoniki w jakimś normalnym dla mnie formacie (czyli Motorola syntax) a nie w tym badziewnym MIT syntax. Może jest jakiś nowszy objdump ? Jakieś sugestie.

Zauważyłem w makefile także takie cudo -mregparm, ale to chyba jest bezużyteczne w przypadku procesorów m68k. Dobrze mówię ?
[#5] Re: gcc - pytania

@asman, post #4

Zauważyłem w makefile także takie cudo -mregparm, ale to chyba jest bezużyteczne w przypadku procesorów m68k.
To jest właśnie bardzo użyteczne cudo i powoduje, że argumenty do funkcji są przekazywane w rejestrach procesora, a nie przez stos. Bez wartości liczbowej maksymalnie 4 argumenty (chyba że kompilujemy pod FPU i mamy też argumenty zmiennoprzecinkowe) idą w rejestrach (d0/d1/a0/a1), ale można też użyć -mregparm=n i zwiększyć, lub zmniejszyć tę liczbę. Szczegółowo jest to opisane w "gcc-amigaos.guide", który przy instalacji pełnego ADE, albo mojego GCC-packa ląduje w "GG:guide".

Dzięki temu kod jest jednocześnie i szybszy i krótszy.

Przykładowo aktualna wersja Untangle skompilowana bez -mregparm ma 15400 bajtów, a z nim 14600 bajtów. Zysk na szybkości w tego rodzaju grze może nie jest szczególnie istotny, czy łatwy do zmierzenia. Jasnym jednak jest, że zrzucenie czegoś na stos, a następnie za chwilę pociągnięcie tego ze stosu, zajmuje czas. Nawet, gdy mamy procesor z data cache.

Używając -mregparm musimy pamiętać o tym, że jeżeli linkujemy z bibliotekami statycznymi, to muszą być one skompilowane z tym samym ustawieniem tego parametru. Linkowane *.o napisane w asmie również muszą przestrzegać konwencji, chyba że ręcznie im od strony C podefiniujemy rejestry przez asm("xx"). Niestety wkładanie argumentów funkcji do określonych rejestrów nie działa w C++. :-/
2
[wyróżniony] [#6] Re: gcc - pytania

@asman, post #4

Czy idzie nauczyć objdump żeby wypluł mnemoniki w jakimś normalnym dla mnie formacie
Niestety nie. Jest kilka sposobów radzenia sobie z tym.
  • przywyknąć
  • disasemblować za pomocą np. IRA. Niestety IRA nie umie odczytać symboli z plików *.o (z pełnego exe umie). Poza tym IRA nie wykona demanglingu nazw funkcji w C++.
  • dałoby się napisać program, który wywoła objdumpa, przechwyci jego wyjście i sformatuje to dla białych ludzi. Najprościej przez pipe, czyli by się pisało np.
    objdump -dC blah.o | magia
    No ale ktoś to musi napisać, warte przemyślenia dla mnie.
4
[#7] Re: gcc - pytania

@Krashan, post #6

Dzięki za odpowiedź.

A nie lepiej poprawić tą kobyłę objdump ?

Muszę przyznać że nawet sciągnąłem źródła gg-binutils (w którym to znajdują się źródła objdump) ale tam to jest jakiś meksyk. To jakaś zbiorowa radosna twórczość. Ogarnąłem jak na razie by skompilować objdump to trzeba najpierw ogarnąć libiberty i bfd.

Rozumiem też że nie ma możliwości manipulowania opcjami (na przykład: -fcall-used-d3) w samym pliku *.c. Byłoby bardziej elastycznie. Te marzenia ... :)

Musze przyznać że jestem rozdarty między C a ASM. Bo jednak gcc potrafi wygenerować całkiem porządny kod. Fakt że kod zaczyna przypominać guano, bo tu register tam w makefile inne opcje. W asm znowu mam większą kontrolę ale też więcej jest okazji do popełnienia błędu. To mam zagadkę :)
[#8] Re: gcc - pytania

@asman, post #7

A nie lepiej poprawić tą kobyłę objdump?
Sam sobie niżej odpowiedziałeś na to pytanie...
1
[#9] Re: gcc - pytania

@asman, post #7

Musze przyznać że jestem rozdarty między C a ASM. Bo jednak gcc potrafi wygenerować całkiem porządny kod.
Zawsze możesz używać asma w kodzie C. "GCC extended asm" wiele potrafi. Popełniłem kiedyś w papierowym "Execu" artykuł na ten temat.
1
[#10] Re: gcc - pytania

@Krashan, post #9

Bawiłem się trochę Gcc z pakietu narzędzi Bartmana/Abyss do Visual Studio Code.
Tam można było pisać w asm w składni "normalnej" bo był używany vasm do asemblacji do obj.
Całkiem sprawnie to działało. Był fajny tutorial autora tego rozszerzenia na YT z którego można sporo się dowiedzieć - np jak profilować i debugować kod.
Główny kod C to nadal GCC.
[#11] Re: gcc - pytania

@Krashan, post #9

Zawsze możesz używać asma w kodzie C. "GCC extended asm" wiele potrafi

To brzmi całkiem nieźle. Może nawet przestanę czuć obrzydzenie do MIT syntax, pokręcę się przy tym chwilę, na stronie https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html coś można poczytać. Dzięki

Kolejne pytanie:
- czy można zmusić gcc żeby nie robił tego wyrównania kodu do adresu podzielnego przez 4. wrzuca mi za funkcjami zero a przed dowala nop. Nie podoba mi się to.

-
[#12] Re: gcc - pytania

@Krashan, post #9

To ja mam kilka pytań około GCC.
Czy waszym zdaniem GCC jest najlepszą opcją ?
VBCC także pozwala na cross development ma jakieś przewagi nad GCC ?
Czy jest sens używać natywnych starych amigowych kompilatorów jak SAS czy StormC ?
[#13] Re: gcc - pytania

@asman, post #11

Dobra, te zera udało mnie się wywalić za pomocą opcji -mno-align-int. Gorzej z kodem.


Bawiłem się trochę Gcc z pakietu narzędzi Bartmana/Abyss do Visual Studio Code.
Tam można było pisać w asm w składni "normalnej" bo był używany vasm do asemblacji do obj.
Całkiem sprawnie to działało. Był fajny tutorial autora tego rozszerzenia na YT z którego można sporo się dowiedzieć - np jak profilować i debugować kod.
Główny kod C to nadal GCC.

Dzięki, zanotowane na później. Na ten czas wyciskam z amigowego gcc 2.95.3.
Jak się trochę pomyśli (wiem to boli) to ten gcc generuje fajny kod. Jeszcze wczoraj nie myślałem że uda mi się wygenerować taki pyszny kod

nop
_MemoryAllocate:	move.l	4.w,a6
	moveq	#1,d1
	swap	d1
	moveq	#$10,d0
	swap	d0
	jsr	-$C6(a6)
	tst.l	d0
	beq.s	lbC000070
	move.l	d0,a4
	move.l	#$10002,d1
	moveq	#$30,d0
	swap	d0
	jsr	-$C6(a6)
	move.l	d0,4(a4)
lbC000070:	rts


Oczywiście ten nop irytuje, ale na to też znajdę sposób, ten czy inny. Ostatecznie zdeasembluje kod, powywalam i z asembluje ponownie.
[#14] Re: gcc - pytania

@asman, post #13

Pod wzgledem krotkosci jest ok.
Pod wzgledem funkcjonalnosci raczej jest slaby.
Nie wiadomo czy zaalokowales any/fast ani czy zaalokowales chip, jesli wczesniej zaalokowales any/fast mem.
Tak mi sie przynajmniej wydaje, i nie masz nawet tego jak sprawdzic potem.
Dlatego ja jestem fanem BSS i BSS_C.
1
[#15] Re: gcc - pytania

@Sventevith, post #12

Gcc ma tę przewagę nad vbcc że produkuje działający kod :d
Kiedyś używałem vbcc i pewnie to była wina jakiegoś optymalizatora, ale mi kompletnie rozwalał logikę w gierce. Po przesiadce na gcc ustąpiło.
[#16] Re: gcc - pytania

@teh_KaiN, post #15

Swoje projekty kompilujesz na gcc czy na amigowych sas/stormC ?
[#17] Re: gcc - pytania

@Sventevith, post #16

Gcc 13 Bartmana z vscode
[#18] Re: gcc - pytania

@teh_KaiN, post #17

No właśnie jak skończę swoją A2000 konfigurować z turbo i OS3.2 spróbuje kompilować na Amidzę ale raczej ciężko pozbyć się wygody VSC i emu. Każda zwiecha na Amidzę zabiera czas na reboot tego nie ma w przypadku cross developmentu.
1
[#19] Re: gcc - pytania

@Sventevith, post #12

Czy waszym zdaniem GCC jest najlepszą opcją?
Tak.
VBCC także pozwala na cross development ma jakieś przewagi nad GCC?
Jest zauważalnie szybszy, co ma znaczenie przy pracy na rzeczywistej Amidze. Ale to chyba jedyna jego zaleta.
Czy jest sens używać natywnych starych amigowych kompilatorów jak SAS czy StormC ?
Moim zdaniem nie. Chociaż z kolei SAS/C jest jeszcze szybszy niż VBCC, więc na jakichś słabych konfigach... SAS jest używalny na A500 z fastem i twardym dyskiem.
[#20] Re: gcc - pytania

@Krashan, post #19

Sas jest dobrym, szybkim i stabilnym kompilatorem, uzywam go w polaczeniu z Visual Studio (z moimi dodatkami) jako jedna z dwoch dostepnych platform (druga to gcc) i mam praktycznie wszystko co vs oferuje dla c oraz szybkosc sas (na WinUAE z Jit :).
[#21] Re: gcc - pytania

@Don_Adan, post #14

@Don_Adan
Pod wzgledem krotkosci jest ok.
Pod wzgledem funkcjonalnosci raczej jest slaby.
Nie wiadomo czy zaalokowales any/fast ani czy zaalokowales chip, jesli wczesniej zaalokowales any/fast mem.

Diabeł tkwi w szczegółach. Ta procedura alokuje pamięć public i chip, potrzebuje ich obu. W razie niepowodzenia zwracane jest zero które poziom wyżej sprawdzam i zwalniam pamięć public jak chip nie został zaalokowany i wychodzę do OS. Ta pamięć Public będzie też używana na zmienne, dlatego też jest tam move.l d0,a4. Dzięki temu mam elegancko wyzerowane wszystkie zmienne. Ewentualne stany początkowe ustawiam tam gdzie potrzebuje. Dzięki temu nie potrzebuje BSS i BSS_C. Dodatkowo mam całą grę w jednym hunku bez żadnych relokacji, o ile z pozostałymi rzeczami gcc sobie poradzi i zrobi pc-relative kod w przypadku wskaźnika na funkcję. To jeszcze przede mną.

@teh_KaiN

Kiedyś używałem vbcc i pewnie to była wina jakiegoś optymalizatora, ale mi kompletnie rozwalał logikę w gierce.

Zawsze możesz zgłosić do autora, jest otwarty i pomocny. Jak znalazłem błąd związany z tablicą wskaźników na funkcje, to zostało poprawione.

@Sventevith

Czy waszym zdaniem GCC jest najlepszą opcją ?


Dla mnie jak na razie tak. SAS mi też się podoba, StormC nie używałem. A VBCC używam do skrośnej kompilacji.

Ostatnia aktualizacja: 17.10.2024 11:45:46 przez asman
[#22] Re: gcc - pytania

@asman, post #21

Nie procedura jest zla. Przynajmniej dla mnie.
Np. pierwsza alokacja przechodzi, a druga juz nie, czyli masz D0=0, i nie wiesz dlaczego.
Bo A4 nie jest rowne zero, a D0=0.
No i ktora pamiec nie zostala zaalokowana?
Pierwsza czy druga?
Dla mnie, zeby taka procedura miala jakis sens to musi jeszcze sub.l a4,a4 przed pierwsza alokacja uzyte.
[#23] Re: gcc - pytania

@Don_Adan, post #22

Racja, dodałem sub.l a4,a4. Dzięki.
[wyróżniony] [#24] Re: gcc - pytania

@asman, post #23

Mozesz tez sprobowac uzyskac taki kod, o ile kompilator tak potrafi:

_MemoryAllocate:
	move.l	4.w,a6
	moveq	#1,d1
	swap	d1
	moveq	#$10,d0
	swap	d0
	jsr	-$C6(a6)
	move.l	d0,a4
        tst.l	d0
	beq.s	lbC000070
	move.l	#$10002,d1
	moveq	#$30,d0
	swap	d0
	jsr	-$C6(a6)
	move.l	d0,4(a4)
lbC000070:	rts


Wtedy sub.l a4,a4 nie jest potrzebne.
1
[#25] Re: gcc - pytania

@Don_Adan, post #24

Dał radę, zmyślna bestia ten gcc.

;
	nop
_MemoryAllocate:	move.l	4.w,a6
	moveq	#1,d1
	swap	d1
	moveq	#$10,d0
	swap	d0
	jsr	-$C6(a6)
	move.l	d0,a4
	tst.l	d0
	beq.s	lbC00006E
	move.l	#$10002,d1
	moveq	#$30,d0
	swap	d0
	jsr	-$C6(a6)
	move.l	d0,(a4)
lbC00006E:	rts

	nop
_MemoryRelease:	cmp.w	#0,a4
	beq.s	lbC000094
	move.l	4.w,a6
	move.l	(a4),d1
	beq.s	lbC00008A
	moveq	#$30,d0
	swap	d0
	move.l	d1,a1
	jsr	-$D2(a6)
lbC00008A:	moveq	#$10,d0
	swap	d0
	move.l	a4,a1
	jsr	-$D2(a6)
lbC000094:	rts


A wszystko to z takiego źródła + opcja -fcall-used-a6.
/*--------------------------------------------------------------------------*/

static inline struct Library* GetExecBase(void)
{
	return *(struct Library **)4L;
}

/*--------------------------------------------------------------------------*/

int MemoryAllocate(void)
{
	register struct Library *SysBase __asm("a6") = GetExecBase();

	APTR public = AllocMem(MEMORY_PUBLIC_SIZE, MEMF_CLEAR|MEMF_ANY);

	gm = (struct GameMemory *)public;

	if (NULL != public)
	{
		public = AllocMem(MEMORY_CHIP_SIZE, MEMF_CLEAR|MEMF_CHIP);

		gm->chip = public;
	}

	return (int)public;
}

/*--------------------------------------------------------------------------*/

void MemoryRelease(void)
{
	if (NULL != gm)
	{
		register struct Library *SysBase __asm("a6") = GetExecBase();

		if (NULL != gm->chip)
		{
			FreeMem(gm->chip, MEMORY_CHIP_SIZE);
		}

		FreeMem(gm, MEMORY_PUBLIC_SIZE);
	}
}

/*--------------------------------------------------------------------------*/



Chyba zrobię repo na githubie tak by można zobaczyć moje boje z gcc. :)



Ostatnia aktualizacja: 17.10.2024 16:15:11 przez asman
1
[#26] Re: gcc - pytania

@docent, post #20

Czyli kod jest na dysku amigowym w postaci plików i w ten sposób VSC i Emulator ma do źródeł dostęp a kompilację odpalsz z emulatora ?
O jakich dodatkach do VSC dla SAS mówisz ?
[wyróżniony] [#27] Re: gcc - pytania

@asman, post #25

Prawie mogloby byc.

Mnie razi:

_MemoryRelease:
	cmp.w	#0,a4
	beq.s	lbC000094


Powinno byc
_MemoryRelease:
	move.l	a4,d1
	beq.s	lbC000094


Mozesz na GitHubie dac, niech sie inni ucza, jak wyciskac GCC.
1
[#28] Re: gcc - pytania

@Don_Adan, post #27

Jesteś nieoceniony, faktycznie tak byłoby lepiej i dał radę gcc + dodatkowa opcja -fcall-used-d2.

void MemoryRelease(void)
{
	register APTR memoryBlock __asm("d2") = gm;

	if (NULL != memoryBlock)
	{
		register struct Library *SysBase __asm("a6") = GetExecBase();

		if (NULL != gm->chip)
		{
			FreeMem(gm->chip, MEMORY_CHIP_SIZE);
		}

		FreeMem(memoryBlock, MEMORY_PUBLIC_SIZE);
	}
}


Wygenerowało

;
	nop
_MemoryRelease:	move.l	a4,d2
	beq.s	lbC000092
	move.l	4.w,a6
	move.l	(a4),d1
	beq.s	lbC000088
	moveq	#$30,d0
	swap	d0
	move.l	d1,a1
	jsr	-$D2(a6)
lbC000088:	moveq	#$10,d0
	swap	d0
	move.l	d2,a1
	jsr	-$D2(a6)
lbC000092:	rts


Z tym githubem jeszcze się wstrzymam, muszę się wymasterować z tego gcc i c, a to potrwa. I jak zwykle dzięki Don za pomoc.
[#29] Re: gcc - pytania

@asman, post #28

No nie wiem, niby raczej to bez znaczenia w tym przypadku, ale kompilator do takich rzeczy powinien uzywac rejestrow scratch czyli D0 lub D1, a nie D2.
Tym bardziej, ze pare linijek nizej uzywa do tego samego celu rejestru D1:

move.l	(a4),d1
	beq.s	lbC000088


Czyli co nie ogarnia tego? Albo to jakis blad w GCC, ktorego uzywasz.
[#30] Re: gcc - pytania

@Don_Adan, post #29

Moja wiedza o gcc jest jak na razie niewielka, ale mam kilka pomysłów i jutro sprawdzę.

Ostatnia aktualizacja: 17.10.2024 23:08:42 przez asman
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem