<div>I'm attempting to implement a clang/llvm prototype of mixed mode x86 and x86_64 code.  My intent is to be able to generate "32-bit" code that emulates another 32bit platform (without porting that code to 64-bit or intel, so that all the pointer references in that code can still be 32-bit), <span class="colour" style="color:rgb(34, 34, 34)"><span class="font" style="font-family:Arial, "Helvetica Neue", Helvetica, sans-serif"><span class="size" style="font-size:14px">and run that code in a thread that explicitly allocates stack in "low memory".  </span></span></span>I've hacked enough of clang and llvm to make this work in a limited fashion, defining two address spaces:<br></div><div><br></div><div><span class="s1">   -p0:32:32:32-p1:64:64:64</span><br></div><div><br></div><div>(and following the x64 linux model in some places (but not all, like the x64 specific ELF format)).<br></div><div><br></div><div>I'm now able to generate 32-bit memory model code and execute it in a 32-bit process.  Pointers and stack and data references are all 32-bit, but the code is able to use 64-bit registers (like the x64 memory model, but all in the same process).<br></div><div><br></div><div>Now, I'm trying to see what's required to call out to 64-bit code from this "32-bit" code, and access that "high" memory range for calls to runtime infrastructure implemented 64-bit shared libraries.  I see that I can define types (and indirectly pointers to those types) in my "far" address space:<br></div><div><br></div><div><span class="s1">   typedef int a1int __attribute__( ( address_space( 1 ) ) );</span><br></div><p class="p1">The int * references in the IR do have the desired(1) address space, and generated code accessing a 32-bit pointer vs. a 64-bit pointer looks about right:<br></p><p class="p1"><span class="s1">00000000000001c0 <addr0>:</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space"> </span>1c0: <span class="Apple-converted-space">  </span>55<span class="Apple-converted-space">                      </span>push <span class="Apple-converted-space">  </span>%rbp</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space"> </span>1c1: <span class="Apple-converted-space">  </span>89 e5 <span class="Apple-converted-space">                  </span>mov<span class="Apple-converted-space">    </span>%esp,%ebp</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space"> </span>1c3: <span class="Apple-converted-space">  </span>89 7d fc<span class="Apple-converted-space">                </span>mov<span class="Apple-converted-space">    </span>%edi,-0x4(%rbp)</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space"> </span>1c6: <span class="Apple-converted-space">  </span>8b 7d fc<span class="Apple-converted-space">                </span>mov<span class="Apple-converted-space">    </span>-0x4(%rbp),%edi</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space"> </span>1c9: <span class="Apple-converted-space">  </span>67 8b 07<span class="Apple-converted-space">                </span>mov<span class="Apple-converted-space">    </span>(%edi),%eax</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space"> </span>1cc: <span class="Apple-converted-space">  </span>5d<span class="Apple-converted-space">                      </span>pop<span class="Apple-converted-space">    </span>%rbp</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space"> </span>1cd: <span class="Apple-converted-space">  </span>c3<span class="Apple-converted-space">                      </span>retq<span class="Apple-converted-space">   </span></span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space"> </span>1ce: <span class="Apple-converted-space">  </span>66 90 <span class="Apple-converted-space">                  </span>xchg <span class="Apple-converted-space">  </span>%ax,%ax</span><br></p><p class="p2"><br></p><p class="p1"><span class="s1">00000000000001d0 <addr1>:</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space"> </span>1d0: <span class="Apple-converted-space">  </span>55<span class="Apple-converted-space">                      </span>push <span class="Apple-converted-space">  </span>%rbp</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space"> </span>1d1: <span class="Apple-converted-space">  </span>89 e5 <span class="Apple-converted-space">                  </span>mov<span class="Apple-converted-space">    </span>%esp,%ebp</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space"> </span>1d3: <span class="Apple-converted-space">  </span>48 89 7d f8 <span class="Apple-converted-space">            </span>mov<span class="Apple-converted-space">    </span>%rdi,-0x8(%rbp)</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space"> </span>1d7: <span class="Apple-converted-space">  </span>48 8b 7d f8 <span class="Apple-converted-space">            </span>mov<span class="Apple-converted-space">    </span>-0x8(%rbp),%rdi</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space"> </span>1db: <span class="Apple-converted-space">  </span>8b 07 <span class="Apple-converted-space">                  </span>mov<span class="Apple-converted-space">    </span>(%rdi),%eax</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space"> </span>1dd: <span class="Apple-converted-space">  </span>5d<span class="Apple-converted-space">                      </span>pop<span class="Apple-converted-space">    </span>%rbp</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space"> </span>1de: <span class="Apple-converted-space">  </span>c3<span class="Apple-converted-space">                      </span>retq<span class="Apple-converted-space">   </span></span><br></p><div>With IR:<br></div><div><br></div><p class="p1"><span class="s1">; Function Attrs: nounwind uwtable</span><br></p><p class="p1"><span class="s1">define i32 @addr0(i32* %p) #0 {</span><br></p><p class="p1"><span class="s1">entry:</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space">  </span>%p.addr = alloca i32*, align 4</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space">  </span>store i32* %p, i32** %p.addr, align 4</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space">  </span>%0 = load i32*, i32** %p.addr, align 4</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space">  </span>%1 = load i32, i32* %0, align 4</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space">  </span>ret i32 %1</span><br></p><p class="p1"><span class="s1">}</span><br></p><p class="p2"><br></p><p class="p1"><span class="s1">; Function Attrs: nounwind uwtable</span><br></p><p class="p1"><span class="s1">define i32 @addr1(i32 addrspace(1)* %p) #0 {</span><br></p><p class="p1"><span class="s1">entry:</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space">  </span>%p.addr = alloca i32 addrspace(1)*, align 4</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space">  </span>store i32 addrspace(1)* %p, i32 addrspace(1)** %p.addr, align 4</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space">  </span>%0 = load i32 addrspace(1)*, i32 addrspace(1)** %p.addr, align 4</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space">  </span>%1 = load i32, i32 addrspace(1)* %0, align 4</span><br></p><p class="p1"><span class="s1"><span class="Apple-converted-space">  </span>ret i32 %1</span><br></p><p class="p1"><span class="s1">}</span><br></p><div><br></div><div>However, sizeof() for such a pointer is still 4.  <br></div><div><br></div><div><span class="colour" style="color:rgb(34, 34, 34)"><span class="font" style="font-family:Arial, "Helvetica Neue", Helvetica, sans-serif"><span class="size" style="font-size:14px">I find address spaces used in some GPU and opencl code.  </span></span></span>Are there any targets that utilize address spaces to generate the equivalent of "near" or "far" pointers, where the address range of a "near" pointer is less than that of a "far" pointer?  If so, I'd like to look at that code, to see if I can model what I'm trying on that.<br></div><div><br></div><div class="protonmail_signature_block "><div class="protonmail_signature_block-user "><div>--<br></div><div>Peeter<br></div></div><div class="protonmail_signature_block-proton protonmail_signature_block-empty"><br></div></div><div><br></div>