Rocksolid Light

Welcome to RetroBBS

mail  files  register  newsreader  groups  login

Message-ID:  

Numeric stability is probably not all that important when you're guessing.


devel / comp.lang.c++ / aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler

SubjectAuthor
* aarch64 - 64-Bit ARM - return by value - GNU g++ inline assemblerFrederick Virchanza Gotham
+* Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assemblerBonita Montero
|+* Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assemblerFrederick Virchanza Gotham
||+- Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assemblerBonita Montero
||`- Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assemblerChris M. Thomasson
|`- Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assemblerScott Lurndal
`* Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assemblerFrederick Virchanza Gotham
 +* Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assemblerScott Lurndal
 |`* Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assemblerFrederick Virchanza Gotham
 | +- Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assemblerScott Lurndal
 | `- Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assemblerBonita Montero
 `* Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assemblerChris M. Thomasson
  `* Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assemblerFrederick Virchanza Gotham
   `- Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assemblerFrederick Virchanza Gotham

1
aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler

<74f0d07f-b1cd-42df-bf6d-fb0c701b3165n@googlegroups.com>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=894&group=comp.lang.c%2B%2B#894

  copy link   Newsgroups: comp.lang.c++
X-Received: by 2002:ad4:57c5:0:b0:635:e17b:1c81 with SMTP id y5-20020ad457c5000000b00635e17b1c81mr80380qvx.3.1689603853852;
Mon, 17 Jul 2023 07:24:13 -0700 (PDT)
X-Received: by 2002:a05:6808:19a2:b0:3a0:44fb:53c2 with SMTP id
bj34-20020a05680819a200b003a044fb53c2mr17074041oib.0.1689603853604; Mon, 17
Jul 2023 07:24:13 -0700 (PDT)
Path: i2pn2.org!i2pn.org!usenet.blueworldhosting.com!diablo1.usenet.blueworldhosting.com!peer02.iad!feed-me.highwinds-media.com!news.highwinds-media.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: comp.lang.c++
Date: Mon, 17 Jul 2023 07:24:13 -0700 (PDT)
Injection-Info: google-groups.googlegroups.com; posting-host=194.168.183.164; posting-account=w4UqJAoAAAAYC-PItfDbDoVGcg0yISyA
NNTP-Posting-Host: 194.168.183.164
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <74f0d07f-b1cd-42df-bf6d-fb0c701b3165n@googlegroups.com>
Subject: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler
From: cauldwell.thomas@gmail.com (Frederick Virchanza Gotham)
Injection-Date: Mon, 17 Jul 2023 14:24:13 +0000
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Received-Bytes: 3567
 by: Frederick Virchanza - Mon, 17 Jul 2023 14:24 UTC

I'm trying to write a very simple function in two or three aarch64 instructions as 'inline assembler' inside a C++ source file.

With the aarch64 calling convention on Linux, if a function returns a very large struct by value, then the address of where to store the return value is passed in the X8 register. This is out of the ordinary as far as calling conventions go. Every other calling convention, for example System V x86_64, Microsoft x64, cdecl, stdcall, arm32, pass the address of the return value in the first parameter. So for example with x86_64 on Linux, the RDI register contains the address of where to store the very large struct.

I want to try emulate this behaviour on aarch64 on Linux. When my assembler function is entered, I want it to do two things:
(1) Put the address of the indirect return object into the first parameter register, i.e. move X8 to X0
(2) Jump to a location specified by a global function pointer

So here's how I think my assembler function should look:

__asm("Invoke: \n"
" mov x0, x8 \n" // move return value address into 1st parameter
" mov x9, f \n" // Load address of code into register
" br x9 \n" // Jump to code
);

I don't know what's wrong here but it doesn't work. In the following complete C++ program, I use the class 'std::mutex' as it's a good example of a class that can't be copied or moved (I am relying on mandatory Return Value Optimisation).

Here is my entire program in one C++ file, could someone please help me write the assembler function properly? Am I supposed to be using the ADRP and LDR instructions instead of MOV?

#include <mutex> // mutex
#include <iostream> // cout, endl
using std::cout, std::endl;

void (*f)(void) = nullptr;

extern "C" void Invoke(void);

__asm("Invoke: \n"
" mov x0, x8 \n" // move return value address into 1st parameter
" mov x9, f \n" // Load address of code into register
" br x9 \n" // Jump to code
);

void Func(std::mutex *const p)
{ cout << "Address of return value: " << p << endl;
}

int main(void)
{ f = (void(*)(void))Func;

auto const p = reinterpret_cast<std::mutex (*)(void)>(Invoke);

auto retval = p();

cout << "Address of return value: " << &retval << endl;
}

Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler

<u93ml4$19efq$1@dont-email.me>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=896&group=comp.lang.c%2B%2B#896

  copy link   Newsgroups: comp.lang.c++
Path: i2pn2.org!i2pn.org!eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Bonita.Montero@gmail.com (Bonita Montero)
Newsgroups: comp.lang.c++
Subject: Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler
Date: Mon, 17 Jul 2023 17:27:33 +0200
Organization: A noiseless patient Spider
Lines: 54
Message-ID: <u93ml4$19efq$1@dont-email.me>
References: <74f0d07f-b1cd-42df-bf6d-fb0c701b3165n@googlegroups.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Injection-Date: Mon, 17 Jul 2023 15:27:32 -0000 (UTC)
Injection-Info: dont-email.me; posting-host="1921b66ea6d58a31332f96cde852b944";
logging-data="1358330"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18b1p/80ReEFaFpw3cU533fLXXd2fD4L/Q="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:P1UjxBG9tTDA7FXfQekz9Z2lyi8=
Content-Language: de-DE
In-Reply-To: <74f0d07f-b1cd-42df-bf6d-fb0c701b3165n@googlegroups.com>
 by: Bonita Montero - Mon, 17 Jul 2023 15:27 UTC

Why not simply accept the ARM ABI for that ?
For me it doesn't matter where the return value pointer is stored.

Am 17.07.2023 um 16:24 schrieb Frederick Virchanza Gotham:
> I'm trying to write a very simple function in two or three aarch64 instructions as 'inline assembler' inside a C++ source file.
>
> With the aarch64 calling convention on Linux, if a function returns a very large struct by value, then the address of where to store the return value is passed in the X8 register. This is out of the ordinary as far as calling conventions go. Every other calling convention, for example System V x86_64, Microsoft x64, cdecl, stdcall, arm32, pass the address of the return value in the first parameter. So for example with x86_64 on Linux, the RDI register contains the address of where to store the very large struct.
>
> I want to try emulate this behaviour on aarch64 on Linux. When my assembler function is entered, I want it to do two things:
> (1) Put the address of the indirect return object into the first parameter register, i.e. move X8 to X0
> (2) Jump to a location specified by a global function pointer
>
> So here's how I think my assembler function should look:
>
> __asm("Invoke: \n"
> " mov x0, x8 \n" // move return value address into 1st parameter
> " mov x9, f \n" // Load address of code into register
> " br x9 \n" // Jump to code
> );
>
> I don't know what's wrong here but it doesn't work. In the following complete C++ program, I use the class 'std::mutex' as it's a good example of a class that can't be copied or moved (I am relying on mandatory Return Value Optimisation).
>
> Here is my entire program in one C++ file, could someone please help me write the assembler function properly? Am I supposed to be using the ADRP and LDR instructions instead of MOV?
>
> #include <mutex> // mutex
> #include <iostream> // cout, endl
> using std::cout, std::endl;
>
> void (*f)(void) = nullptr;
>
> extern "C" void Invoke(void);
>
> __asm("Invoke: \n"
> " mov x0, x8 \n" // move return value address into 1st parameter
> " mov x9, f \n" // Load address of code into register
> " br x9 \n" // Jump to code
> );
>
> void Func(std::mutex *const p)
> {
> cout << "Address of return value: " << p << endl;
> }
>
> int main(void)
> {
> f = (void(*)(void))Func;
>
> auto const p = reinterpret_cast<std::mutex (*)(void)>(Invoke);
>
> auto retval = p();
>
> cout << "Address of return value: " << &retval << endl;
> }

Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler

<682ece22-d253-4254-9f9c-34b0f6d717cfn@googlegroups.com>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=899&group=comp.lang.c%2B%2B#899

  copy link   Newsgroups: comp.lang.c++
X-Received: by 2002:a05:622a:345:b0:403:e8a7:bd9b with SMTP id r5-20020a05622a034500b00403e8a7bd9bmr25451qtw.11.1689610437443;
Mon, 17 Jul 2023 09:13:57 -0700 (PDT)
X-Received: by 2002:a05:6808:2024:b0:3a3:6881:242 with SMTP id
q36-20020a056808202400b003a368810242mr17444382oiw.11.1689610437158; Mon, 17
Jul 2023 09:13:57 -0700 (PDT)
Path: i2pn2.org!i2pn.org!usenet.blueworldhosting.com!diablo1.usenet.blueworldhosting.com!peer02.iad!feed-me.highwinds-media.com!news.highwinds-media.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: comp.lang.c++
Date: Mon, 17 Jul 2023 09:13:56 -0700 (PDT)
In-Reply-To: <u93ml4$19efq$1@dont-email.me>
Injection-Info: google-groups.googlegroups.com; posting-host=92.40.190.200; posting-account=w4UqJAoAAAAYC-PItfDbDoVGcg0yISyA
NNTP-Posting-Host: 92.40.190.200
References: <74f0d07f-b1cd-42df-bf6d-fb0c701b3165n@googlegroups.com> <u93ml4$19efq$1@dont-email.me>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <682ece22-d253-4254-9f9c-34b0f6d717cfn@googlegroups.com>
Subject: Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler
From: cauldwell.thomas@gmail.com (Frederick Virchanza Gotham)
Injection-Date: Mon, 17 Jul 2023 16:13:57 +0000
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Received-Bytes: 2266
 by: Frederick Virchanza - Mon, 17 Jul 2023 16:13 UTC

On Monday, July 17, 2023 at 4:27:49 PM UTC+1, Bonita Montero wrote:
>
> Why not simply accept the ARM ABI for that ?
> For me it doesn't matter where the return value pointer is stored.

I'm writing a universal header file for all operating systems, all processors and all calling conventions, to invoke functions with guaranteed elision of copy/move operations when dealing with Named Return Value Optimisation. Currently the C++ Standard only mandates elision with RVO -- but not with NRVO.

Since 99% of calling conventions work the same way, it makes sense to model my system on 99% of systems and to make aarch64 be the exception. So I will try get the aarch64 implementation to behave like all the others. I started a thread on the Standard Proposals mailing list:

https://lists.isocpp.org/std-proposals/2023/07/7269.php

But anyway I need to figure out how to use inline assembler get the value from the X8 register. It should be really simple but I can't get it to work..

Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler

<u93ppi$19nh3$1@dont-email.me>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=901&group=comp.lang.c%2B%2B#901

  copy link   Newsgroups: comp.lang.c++
Path: i2pn2.org!i2pn.org!eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Bonita.Montero@gmail.com (Bonita Montero)
Newsgroups: comp.lang.c++
Subject: Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler
Date: Mon, 17 Jul 2023 18:21:06 +0200
Organization: A noiseless patient Spider
Lines: 16
Message-ID: <u93ppi$19nh3$1@dont-email.me>
References: <74f0d07f-b1cd-42df-bf6d-fb0c701b3165n@googlegroups.com>
<u93ml4$19efq$1@dont-email.me>
<682ece22-d253-4254-9f9c-34b0f6d717cfn@googlegroups.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Injection-Date: Mon, 17 Jul 2023 16:21:06 -0000 (UTC)
Injection-Info: dont-email.me; posting-host="1921b66ea6d58a31332f96cde852b944";
logging-data="1367587"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19A9E1jgJno43r88hyk2v5vDtKvLE5C9e8="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:eADFM0j6Fwm0YOau6vTXczohgKQ=
Content-Language: de-DE
In-Reply-To: <682ece22-d253-4254-9f9c-34b0f6d717cfn@googlegroups.com>
 by: Bonita Montero - Mon, 17 Jul 2023 16:21 UTC

Am 17.07.2023 um 18:13 schrieb Frederick Virchanza Gotham:

> I'm writing a universal header file for all operating systems, all processors and all calling conventions, to invoke functions with guaranteed elision of copy/move operations when dealing with Named Return Value Optimisation. Currently the C++ Standard only mandates elision with RVO -- but not with NRVO.

The amount of assembler code is always very small because what
the compiler can do is almost always good. So it shouldn't be
a problem to write the assembler part for each platform separately.
I do it like this, too.

> Since 99% of calling conventions work the same way, ...

This may be so from a core principles perspective, but the
implementations are very different when you look at it in
detail. Somehow what you are doing seems to me like you want
to make circles square.

Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler

<WXdtM.291713$Bq67.193381@fx13.iad>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=902&group=comp.lang.c%2B%2B#902

  copy link   Newsgroups: comp.lang.c++
Path: i2pn2.org!i2pn.org!weretis.net!feeder6.news.weretis.net!usenet.blueworldhosting.com!diablo1.usenet.blueworldhosting.com!peer02.iad!feed-me.highwinds-media.com!news.highwinds-media.com!fx13.iad.POSTED!not-for-mail
X-newsreader: xrn 9.03-beta-14-64bit
Sender: scott@dragon.sl.home (Scott Lurndal)
From: scott@slp53.sl.home (Scott Lurndal)
Reply-To: slp53@pacbell.net
Subject: Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler
Newsgroups: comp.lang.c++
References: <74f0d07f-b1cd-42df-bf6d-fb0c701b3165n@googlegroups.com> <u93ml4$19efq$1@dont-email.me>
Lines: 17
Message-ID: <WXdtM.291713$Bq67.193381@fx13.iad>
X-Complaints-To: abuse@usenetserver.com
NNTP-Posting-Date: Mon, 17 Jul 2023 16:25:26 UTC
Organization: UsenetServer - www.usenetserver.com
Date: Mon, 17 Jul 2023 16:25:26 GMT
X-Received-Bytes: 1429
 by: Scott Lurndal - Mon, 17 Jul 2023 16:25 UTC

Bonita Montero <Bonita.Montero@gmail.com> writes:
>Why not simply accept the ARM ABI for that ?
>For me it doesn't matter where the return value pointer is stored.
>
>Am 17.07.2023 um 16:24 schrieb Frederick Virchanza Gotham:
>
>>
>> Here is my entire program in one C++ file, could someone please help me write the assembler function properly? Am I supposed to be using the ADRP and LDR instructions instead of MOV?

Messing around like you have been in the low-level stuff using
inline assembler is a recipe for disaster. It's not recommended.

AArch64 is a typical load-store RISC architecture. The MOV instruction
supports either register to register moves or immediate to register moves.

Only LDR/STR (and variants) provide access to memory.

Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler

<a7da72af-5843-4d9b-8ce9-48c191837489n@googlegroups.com>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=903&group=comp.lang.c%2B%2B#903

  copy link   Newsgroups: comp.lang.c++
X-Received: by 2002:ad4:5a03:0:b0:637:1b0b:834c with SMTP id ei3-20020ad45a03000000b006371b0b834cmr89212qvb.2.1689613247597;
Mon, 17 Jul 2023 10:00:47 -0700 (PDT)
X-Received: by 2002:a05:6870:5a8a:b0:1b0:7c1a:4a6e with SMTP id
dt10-20020a0568705a8a00b001b07c1a4a6emr11121712oab.3.1689613246829; Mon, 17
Jul 2023 10:00:46 -0700 (PDT)
Path: i2pn2.org!i2pn.org!usenet.goja.nl.eu.org!3.eu.feeder.erje.net!feeder.erje.net!newsreader4.netcologne.de!news.netcologne.de!peer03.ams1!peer.ams1.xlned.com!news.xlned.com!peer02.iad!feed-me.highwinds-media.com!news.highwinds-media.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: comp.lang.c++
Date: Mon, 17 Jul 2023 10:00:46 -0700 (PDT)
In-Reply-To: <74f0d07f-b1cd-42df-bf6d-fb0c701b3165n@googlegroups.com>
Injection-Info: google-groups.googlegroups.com; posting-host=92.40.190.201; posting-account=w4UqJAoAAAAYC-PItfDbDoVGcg0yISyA
NNTP-Posting-Host: 92.40.190.201
References: <74f0d07f-b1cd-42df-bf6d-fb0c701b3165n@googlegroups.com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <a7da72af-5843-4d9b-8ce9-48c191837489n@googlegroups.com>
Subject: Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler
From: cauldwell.thomas@gmail.com (Frederick Virchanza Gotham)
Injection-Date: Mon, 17 Jul 2023 17:00:47 +0000
Content-Type: text/plain; charset="UTF-8"
X-Received-Bytes: 1896
 by: Frederick Virchanza - Mon, 17 Jul 2023 17:00 UTC

On Monday, July 17, 2023, Frederick Gotham wrote:

> __asm("Invoke: \n"
> " mov x0, x8 \n" // move return value address into 1st parameter
> " mov x9, f \n" // Load address of code into register
> " br x9 \n" // Jump to code
> );

Instead of using "inline assembler" inside a C++ source file, I instead tried to make a separate assembler file.

Here's what I have, but it still doesn't work, it's still segfaulting inside 'detail_Invoke':

..text

..global tl_p
..Addr_tl_p:
.xword tl_p

..global detail_Invoke
detail_Invoke:
adrp x9, [.Addr_tl_p]
ldr x9, [x9]
mov x10, x9
br x10

Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler

<7zetM.60816$ayP.7688@fx38.iad>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=904&group=comp.lang.c%2B%2B#904

  copy link   Newsgroups: comp.lang.c++
Path: i2pn2.org!i2pn.org!usenet.blueworldhosting.com!diablo1.usenet.blueworldhosting.com!peer01.iad!feed-me.highwinds-media.com!news.highwinds-media.com!fx38.iad.POSTED!not-for-mail
X-newsreader: xrn 9.03-beta-14-64bit
Sender: scott@dragon.sl.home (Scott Lurndal)
From: scott@slp53.sl.home (Scott Lurndal)
Reply-To: slp53@pacbell.net
Subject: Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler
Newsgroups: comp.lang.c++
References: <74f0d07f-b1cd-42df-bf6d-fb0c701b3165n@googlegroups.com> <a7da72af-5843-4d9b-8ce9-48c191837489n@googlegroups.com>
Lines: 26
Message-ID: <7zetM.60816$ayP.7688@fx38.iad>
X-Complaints-To: abuse@usenetserver.com
NNTP-Posting-Date: Mon, 17 Jul 2023 17:07:15 UTC
Organization: UsenetServer - www.usenetserver.com
Date: Mon, 17 Jul 2023 17:07:15 GMT
X-Received-Bytes: 1439
 by: Scott Lurndal - Mon, 17 Jul 2023 17:07 UTC

Frederick Virchanza Gotham <cauldwell.thomas@gmail.com> writes:
>On Monday, July 17, 2023, Frederick Gotham wrote:
>
>> __asm("Invoke: \n"
>> " mov x0, x8 \n" // move return value address into 1st parameter
>> " mov x9, f \n" // Load address of code into register
>> " br x9 \n" // Jump to code
>> );
>
>
>Instead of using "inline assembler" inside a C++ source file, I instead tried to make a separate assembler file.
>
>Here's what I have, but it still doesn't work, it's still segfaulting inside 'detail_Invoke':
>

Execute your application using gdb, then when it faults, examine
the faulting instruction:

(gdb) x/i $pc

Then look at the registers:

(gdb) info reg

The cause of the fault should be evident from that data.

Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler

<31214979-b8ee-4bc9-b611-3cf9adb1dc76n@googlegroups.com>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=905&group=comp.lang.c%2B%2B#905

  copy link   Newsgroups: comp.lang.c++
X-Received: by 2002:a05:620a:4707:b0:767:1acb:61fb with SMTP id bs7-20020a05620a470700b007671acb61fbmr401qkb.15.1689615076697;
Mon, 17 Jul 2023 10:31:16 -0700 (PDT)
X-Received: by 2002:a05:6808:1592:b0:3a3:c493:b971 with SMTP id
t18-20020a056808159200b003a3c493b971mr17786529oiw.7.1689615076447; Mon, 17
Jul 2023 10:31:16 -0700 (PDT)
Path: i2pn2.org!i2pn.org!usenet.blueworldhosting.com!diablo1.usenet.blueworldhosting.com!peer02.iad!feed-me.highwinds-media.com!news.highwinds-media.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: comp.lang.c++
Date: Mon, 17 Jul 2023 10:31:15 -0700 (PDT)
In-Reply-To: <7zetM.60816$ayP.7688@fx38.iad>
Injection-Info: google-groups.googlegroups.com; posting-host=92.40.190.204; posting-account=w4UqJAoAAAAYC-PItfDbDoVGcg0yISyA
NNTP-Posting-Host: 92.40.190.204
References: <74f0d07f-b1cd-42df-bf6d-fb0c701b3165n@googlegroups.com>
<a7da72af-5843-4d9b-8ce9-48c191837489n@googlegroups.com> <7zetM.60816$ayP.7688@fx38.iad>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <31214979-b8ee-4bc9-b611-3cf9adb1dc76n@googlegroups.com>
Subject: Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler
From: cauldwell.thomas@gmail.com (Frederick Virchanza Gotham)
Injection-Date: Mon, 17 Jul 2023 17:31:16 +0000
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Received-Bytes: 1764
 by: Frederick Virchanza - Mon, 17 Jul 2023 17:31 UTC

On Monday, July 17, 2023 at 6:07:33 PM UTC+1, Scott Lurndal wrote:
>
> Execute your application using gdb, then when it faults, examine
> the faulting instruction:
>
> (gdb) x/i $pc
>
> Then look at the registers:
>
> (gdb) info reg
>
> The cause of the fault should be evident from that data.

My laptop has an x86_64 CPU. I'm using a cross-compiler and then running the executable in a CPU emulator. Hence can't debug.

Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler

<ecftM.18951$gAL.18223@fx01.iad>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=906&group=comp.lang.c%2B%2B#906

  copy link   Newsgroups: comp.lang.c++
Path: i2pn2.org!i2pn.org!usenet.blueworldhosting.com!diablo1.usenet.blueworldhosting.com!peer02.iad!feed-me.highwinds-media.com!news.highwinds-media.com!fx01.iad.POSTED!not-for-mail
X-newsreader: xrn 9.03-beta-14-64bit
Sender: scott@dragon.sl.home (Scott Lurndal)
From: scott@slp53.sl.home (Scott Lurndal)
Reply-To: slp53@pacbell.net
Subject: Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler
Newsgroups: comp.lang.c++
References: <74f0d07f-b1cd-42df-bf6d-fb0c701b3165n@googlegroups.com> <a7da72af-5843-4d9b-8ce9-48c191837489n@googlegroups.com> <7zetM.60816$ayP.7688@fx38.iad> <31214979-b8ee-4bc9-b611-3cf9adb1dc76n@googlegroups.com>
Lines: 28
Message-ID: <ecftM.18951$gAL.18223@fx01.iad>
X-Complaints-To: abuse@usenetserver.com
NNTP-Posting-Date: Mon, 17 Jul 2023 17:51:06 UTC
Organization: UsenetServer - www.usenetserver.com
Date: Mon, 17 Jul 2023 17:51:06 GMT
X-Received-Bytes: 1844
 by: Scott Lurndal - Mon, 17 Jul 2023 17:51 UTC

Frederick Virchanza Gotham <cauldwell.thomas@gmail.com> writes:
>On Monday, July 17, 2023 at 6:07:33=E2=80=AFPM UTC+1, Scott Lurndal wrote:
>>
>> Execute your application using gdb, then when it faults, examine=20
>> the faulting instruction:=20
>>=20
>> (gdb) x/i $pc=20
>>=20
>> Then look at the registers:=20
>>=20
>> (gdb) info reg=20
>>=20
>> The cause of the fault should be evident from that data.
>
>
>My laptop has an x86_64 CPU. I'm using a cross-compiler and then running th=
>e executable in a CPU emulator. Hence can't debug.

My day job is writing SoC emulators for AAarch64 CPUs. The emulator has
the same debug capabilities as any application debugger - breakpoints,
instruction disassembly, register and memory access. I've never encountered
an emulator (AMD's SimNow!, various in-house proprietary emulators, Imperas
ARM emulators, Synopsys Virtualizer, QEMU) which didn't offer such capabilities
as key features.

Given that we boot Linux on our emulator, running gdb itself under linux
on the emulator is another option.

Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler

<u93vb7$1aefv$1@dont-email.me>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=907&group=comp.lang.c%2B%2B#907

  copy link   Newsgroups: comp.lang.c++
Path: i2pn2.org!i2pn.org!eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Bonita.Montero@gmail.com (Bonita Montero)
Newsgroups: comp.lang.c++
Subject: Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler
Date: Mon, 17 Jul 2023 19:55:51 +0200
Organization: A noiseless patient Spider
Lines: 20
Message-ID: <u93vb7$1aefv$1@dont-email.me>
References: <74f0d07f-b1cd-42df-bf6d-fb0c701b3165n@googlegroups.com>
<a7da72af-5843-4d9b-8ce9-48c191837489n@googlegroups.com>
<7zetM.60816$ayP.7688@fx38.iad>
<31214979-b8ee-4bc9-b611-3cf9adb1dc76n@googlegroups.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Mon, 17 Jul 2023 17:55:51 -0000 (UTC)
Injection-Info: dont-email.me; posting-host="1921b66ea6d58a31332f96cde852b944";
logging-data="1391103"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/evvTbzpI1QTCu70oq5jZBmu5Lm90bVDk="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:UPbclrQaPFK1C/E90KfgE9brvuQ=
In-Reply-To: <31214979-b8ee-4bc9-b611-3cf9adb1dc76n@googlegroups.com>
Content-Language: de-DE
 by: Bonita Montero - Mon, 17 Jul 2023 17:55 UTC

Am 17.07.2023 um 19:31 schrieb Frederick Virchanza Gotham:
> On Monday, July 17, 2023 at 6:07:33 PM UTC+1, Scott Lurndal wrote:
>>
>> Execute your application using gdb, then when it faults, examine
>> the faulting instruction:
>>
>> (gdb) x/i $pc
>>
>> Then look at the registers:
>>
>> (gdb) info reg
>>
>> The cause of the fault should be evident from that data.
>
>
> My laptop has an x86_64 CPU. I'm using a cross-compiler and then running the executable in a CPU emulator. Hence can't debug.

I guess you don't write any practical code with that but
some experiments.

Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler

<u941bb$1akkc$1@dont-email.me>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=908&group=comp.lang.c%2B%2B#908

  copy link   Newsgroups: comp.lang.c++
Path: i2pn2.org!i2pn.org!eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: chris.m.thomasson.1@gmail.com (Chris M. Thomasson)
Newsgroups: comp.lang.c++
Subject: Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler
Date: Mon, 17 Jul 2023 11:30:02 -0700
Organization: A noiseless patient Spider
Lines: 19
Message-ID: <u941bb$1akkc$1@dont-email.me>
References: <74f0d07f-b1cd-42df-bf6d-fb0c701b3165n@googlegroups.com>
<u93ml4$19efq$1@dont-email.me>
<682ece22-d253-4254-9f9c-34b0f6d717cfn@googlegroups.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Mon, 17 Jul 2023 18:30:03 -0000 (UTC)
Injection-Info: dont-email.me; posting-host="f8d86ae1f8dc3606d31501621d2a0f62";
logging-data="1397388"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19pwvI7jbRY0JS7ItIHbmURndr0MoOSnNE="
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101
Thunderbird/102.13.0
Cancel-Lock: sha1:Xo4FttmFiorVEfHU0frloKykAPo=
Content-Language: en-US
In-Reply-To: <682ece22-d253-4254-9f9c-34b0f6d717cfn@googlegroups.com>
 by: Chris M. Thomasson - Mon, 17 Jul 2023 18:30 UTC

On 7/17/2023 9:13 AM, Frederick Virchanza Gotham wrote:
> On Monday, July 17, 2023 at 4:27:49 PM UTC+1, Bonita Montero wrote:
>>
>> Why not simply accept the ARM ABI for that ?
>> For me it doesn't matter where the return value pointer is stored.
>
>
> I'm writing a universal header file for all operating systems, all processors and all calling conventions, to invoke functions with guaranteed elision of copy/move operations when dealing with Named Return Value Optimisation. Currently the C++ Standard only mandates elision with RVO -- but not with NRVO.
>
> Since 99% of calling conventions work the same way, it makes sense to model my system on 99% of systems and to make aarch64 be the exception. So I will try get the aarch64 implementation to behave like all the others. I started a thread on the Standard Proposals mailing list:
>
> https://lists.isocpp.org/std-proposals/2023/07/7269.php
>
> But anyway I need to figure out how to use inline assembler get the value from the X8 register. It should be really simple but I can't get it to work.

Make sure to have Intel syntax and GAS syntax versions. Not sure if that
right for you, however, I needed to do that to handle different
assemblers. MASM and GAS primarily. Generally, I stayed away from inline
assembler and used externally assembled files.

Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler

<u941j9$1am7n$1@dont-email.me>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=909&group=comp.lang.c%2B%2B#909

  copy link   Newsgroups: comp.lang.c++
Path: i2pn2.org!i2pn.org!eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: chris.m.thomasson.1@gmail.com (Chris M. Thomasson)
Newsgroups: comp.lang.c++
Subject: Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler
Date: Mon, 17 Jul 2023 11:34:16 -0700
Organization: A noiseless patient Spider
Lines: 28
Message-ID: <u941j9$1am7n$1@dont-email.me>
References: <74f0d07f-b1cd-42df-bf6d-fb0c701b3165n@googlegroups.com>
<a7da72af-5843-4d9b-8ce9-48c191837489n@googlegroups.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Injection-Date: Mon, 17 Jul 2023 18:34:17 -0000 (UTC)
Injection-Info: dont-email.me; posting-host="f8d86ae1f8dc3606d31501621d2a0f62";
logging-data="1399031"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+6WbkNUAws1Wj3YyDLwn/WwaaxjVV7HeY="
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101
Thunderbird/102.13.0
Cancel-Lock: sha1:uljyOtcXc59AtSdLXsg2ABc6pNE=
In-Reply-To: <a7da72af-5843-4d9b-8ce9-48c191837489n@googlegroups.com>
Content-Language: en-US
 by: Chris M. Thomasson - Mon, 17 Jul 2023 18:34 UTC

On 7/17/2023 10:00 AM, Frederick Virchanza Gotham wrote:
> On Monday, July 17, 2023, Frederick Gotham wrote:
>
>> __asm("Invoke: \n"
>> " mov x0, x8 \n" // move return value address into 1st parameter
>> " mov x9, f \n" // Load address of code into register
>> " br x9 \n" // Jump to code
>> );
>
>
> Instead of using "inline assembler" inside a C++ source file, I instead tried to make a separate assembler file.
[...]

Imvho, this is a better route. Worked fine for me:

GAS AT&T syntax

http://web.archive.org/web/20060214112345/http://appcore.home.comcast.net/appcore/src/cpu/i686/ac_i686_gcc_asm.html

MASM Intel syntax

http://web.archive.org/web/20060214112539/http://appcore.home.comcast.net/appcore/src/cpu/i686/ac_i686_masm_asm.html

:^)

Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler

<f020a0f3-d3c4-4beb-8d57-bf5149a85e88n@googlegroups.com>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=915&group=comp.lang.c%2B%2B#915

  copy link   Newsgroups: comp.lang.c++
X-Received: by 2002:ad4:4d44:0:b0:635:eeb9:4fcd with SMTP id m4-20020ad44d44000000b00635eeb94fcdmr79662qvm.2.1689669292321;
Tue, 18 Jul 2023 01:34:52 -0700 (PDT)
X-Received: by 2002:a05:6870:3a03:b0:1b7:6077:bef1 with SMTP id
du3-20020a0568703a0300b001b76077bef1mr12963051oab.0.1689669291982; Tue, 18
Jul 2023 01:34:51 -0700 (PDT)
Path: i2pn2.org!i2pn.org!usenet.blueworldhosting.com!diablo1.usenet.blueworldhosting.com!peer02.iad!feed-me.highwinds-media.com!news.highwinds-media.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: comp.lang.c++
Date: Tue, 18 Jul 2023 01:34:51 -0700 (PDT)
In-Reply-To: <u941j9$1am7n$1@dont-email.me>
Injection-Info: google-groups.googlegroups.com; posting-host=92.40.182.157; posting-account=w4UqJAoAAAAYC-PItfDbDoVGcg0yISyA
NNTP-Posting-Host: 92.40.182.157
References: <74f0d07f-b1cd-42df-bf6d-fb0c701b3165n@googlegroups.com>
<a7da72af-5843-4d9b-8ce9-48c191837489n@googlegroups.com> <u941j9$1am7n$1@dont-email.me>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <f020a0f3-d3c4-4beb-8d57-bf5149a85e88n@googlegroups.com>
Subject: Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler
From: cauldwell.thomas@gmail.com (Frederick Virchanza Gotham)
Injection-Date: Tue, 18 Jul 2023 08:34:52 +0000
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Received-Bytes: 2476
 by: Frederick Virchanza - Tue, 18 Jul 2023 08:34 UTC

Over on comp.unix.programmer, Adam Sampson gave me inline assembler that works:

__asm(".text\n"
"Invoke:\n"
" mov x1, x8\n"
" adr x9, f\n"
" ldr x9, [x9]\n"
" br x9\n"
);

For the sake of posting to this newsgroup, I simplified my problem just a tiny bit. Previously I told you that 'f' was a global variable defined as follows:

void (*f)(void);

but in actual fact it's:

thread_local void (*f)(void);

If I change it to thread_local then try to re-compile the inline assembler, I get a linker error:

R_AARCH64_ADR_PREL_LO21 used with TLS symbol f

Do you know what syntax I use to access the thread_local variable from assembler? Will I need to write a separate function as follows?

void (*getf(void))(void)
{ return f;
}

and then call that function from my assembler? I'm worried about corrupting the caller-saved registers, because I perform a 'br' rather than a 'blr' (i.e. I perform a jump rather than a function call). I suppose I could push all the caller-saved registers before invoking 'getf' and then pop afterward... which I know how to do on x86_64 but I'm new to all this aarch64 stuff..

Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler

<f3e94351-9225-4a80-afe5-1b3a61bfc54en@googlegroups.com>

  copy mid

https://www.rocksolidbbs.com/devel/article-flat.php?id=916&group=comp.lang.c%2B%2B#916

  copy link   Newsgroups: comp.lang.c++
X-Received: by 2002:a05:620a:4493:b0:765:a55c:b638 with SMTP id x19-20020a05620a449300b00765a55cb638mr87192qkp.2.1689677755343;
Tue, 18 Jul 2023 03:55:55 -0700 (PDT)
X-Received: by 2002:a05:6870:98b5:b0:1b0:59e5:2300 with SMTP id
eg53-20020a05687098b500b001b059e52300mr13009119oab.8.1689677755087; Tue, 18
Jul 2023 03:55:55 -0700 (PDT)
Path: i2pn2.org!i2pn.org!weretis.net!feeder6.news.weretis.net!usenet.blueworldhosting.com!diablo1.usenet.blueworldhosting.com!peer02.iad!feed-me.highwinds-media.com!news.highwinds-media.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: comp.lang.c++
Date: Tue, 18 Jul 2023 03:55:54 -0700 (PDT)
In-Reply-To: <f020a0f3-d3c4-4beb-8d57-bf5149a85e88n@googlegroups.com>
Injection-Info: google-groups.googlegroups.com; posting-host=92.40.182.157; posting-account=w4UqJAoAAAAYC-PItfDbDoVGcg0yISyA
NNTP-Posting-Host: 92.40.182.157
References: <74f0d07f-b1cd-42df-bf6d-fb0c701b3165n@googlegroups.com>
<a7da72af-5843-4d9b-8ce9-48c191837489n@googlegroups.com> <u941j9$1am7n$1@dont-email.me>
<f020a0f3-d3c4-4beb-8d57-bf5149a85e88n@googlegroups.com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <f3e94351-9225-4a80-afe5-1b3a61bfc54en@googlegroups.com>
Subject: Re: aarch64 - 64-Bit ARM - return by value - GNU g++ inline assembler
From: cauldwell.thomas@gmail.com (Frederick Virchanza Gotham)
Injection-Date: Tue, 18 Jul 2023 10:55:55 +0000
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Received-Bytes: 3344
 by: Frederick Virchanza - Tue, 18 Jul 2023 10:55 UTC

On Monday 17 July 2023, Frederick Gotham wrote:
>
> If I change it to thread_local then try to re-compile, I get a linker error:
>
> R_AARCH64_ADR_PREL_LO21 used with TLS symbol f
>
> Do you know what syntax I use to access the thread_local variable from assembler? Will I need to write a separate function as follows?

In order to try understand how thread_local variables are accessed from aarch64 assembler, I wrote the following dynamic shared library in C:

__thread void (*f)(void);

void (*g)(void);

void Func(void)
{
g = f;
}

I compiled this to 'libtest.so" and then used 'objdump' on it to see:

<Func>:
Line 01: stp x29, x30, [sp, #-16]!
Line 02: mrs x1, tpidr_el0
Line 03: mov x29, sp
Line 04: adrp x0, 20000 <__cxa_finalize>
Line 05: ldr x2, [x0, #16]
Line 06: add x0, x0, #0x10
Line 07: blr x2
Line 08: adrp x2, 1f000 <__FRAME_END__+0x1e8c8>
Line 09: ldr x2, [x2, #4032]
Line 10: ldr x0, [x1, x0]
Line 11: str x0, [x2]
Line 12: ldp x29, x30, [sp], #16
Line 13: ret

Line #2 appears to put the address of "thread local storage" inside the x1 register.
Lines #4-7 at first glance seem to call the function "__cxz_finalize" (which is the one that gets called at the end of a program to invoke all the destructors of global objects)... but really I just think that the number 0x20000 is being used as a base address to apply offsets to.
Lines #7 definitely is calling some function though, I don't know which one..
Lines #8-12, I'm not sure here... but I think they're moving the value of the thread_local variable 'f' into the global variable 'g'.

Can anyone please help me understand this? And explore how I would go about writing aarch64 to access a thread_local variable called 'f'?

1
server_pubkey.txt

rocksolid light 0.9.8
clearnet tor