<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>Jay, thanks for your explanation!   If your log message could have had some of this information I might have understood what the need was.</div><div><br></div>OK, I've gone back through the logs and see that I did not put this in for specific optimization reasons, though it may have had a historic basis in making something work.  So, let's restore your fix and see what happens.  I wonder if it breaks procedure values (code address + static chain records)?<div><br><div apple-content-edited="true"> <span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div>On Apr 29, 2008, at 5:57 PM, Jay wrote:</div></span></span></span></span></span></span></span></span></div></span></div><div><br class="Apple-interchange-newline"><blockquote type="cite"><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0; "><div class="hmmessage" style="font-size: 10pt; font-family: Tahoma; ">Tony, this is a serious problem on AMD64_LINUX.<br>It is not a problem at all on Win32, as Win32 has a<br>much better codegen model. It's amazing how Linux works..<br><br>Look at the .ms file for ThreadPThread.<br>I looked on AMD64_LINUX and LINUXLIBC6.<br><br>ThreadPThread__InitMutex's call to its own finally<br>block goes through the PLT and on AMD64_LINUX the static link<br>in r10 is trashed.<br><br>It's possible that if you turn on optimizations, the finally<br>block is inlined and that hides the problem, but you can't<br>count on that.<br><br>I was experimenting with another fix at the same time,<br>that of using -fvisibility=hidden on m3cg, but<br>to me that seems more like a C/C++ front end switch,<br>even though cm3cg supports it.<br><br>I can try again and carefully tweak the two variables,<br>see if -fvisibility=hidden suffices. At the level<br>cm3cg operates though, it marks the visibility of everything<br>explicitly, so again, I think my fix is the way.<br><br>As well calls within a file to functions within that file<br>that aren't in an interface are going through the PLT.<br>This is just wasteful.<br><br>They shouldn't even go through the PLT for calls within the<br>same "library" (ie: m3core to m3core, libm3 to libm3).<br><br>What such indirect calls "buy" is that, e.g. the .exe or libm3<br>can replace functions in m3core, or such, and function pointer<br>equality might be achieved. I think the "interposition" feature<br>is widely accepted on Linux, though it is dodgy.<br>I think on Linux going through the PLT for exported functions might<br>be the norm. I'll have to read up more. But going through the PLT<br>for unexported functions is not the norm. Documentation strongly<br>encourages marking visibility and saving the PLT indirection.<br><br>In C/C++ there's further problems of name uniquess of unexported<br>functions across the dynamic link. I believe Modula-3 deals with that,<br>since pretty much every function in the system gets a unique name,<br>exported or not.<br> <br>One or the other or both these changes (public = exported,<br>or -fvisibilit=hidden) optimizes those calls.<br><br>In general going through the PLT is very wasteful when<br>it isn't necessary. There's a bunch of "literature" about<br>this on the web.<br><br>On Windows, to call a function Foo, you just call Foo.<br>If Foo ends up imported, the linker generates a single instruction<br>function for you, Foo, that jumps through __imp__Foo.<br>If you are absolutely sure Foo will be imported and want to<br>optimize a little, you can mark Foo as __declspec(dllimport),<br>however for functions this is totally optional.<br>To export functions, you either mark them __declspec(dllexport)<br>or list them in a .def file. For C++, .def files are a pain, but<br>for C they work just fine, or better.<br>For importing data, you pretty much have to mark it as __declspec(dllimport).<br>Importing data is rare.<br>gcc/ld on Windows have some hack to make this easier that I'm not familiar with.<br><br>So in the absence of importing data, there is just one codegen<br>model that is acceptable -- call Foo.<br>Most function calls, theoretically, are not imported, and this<br>ends up as a normal direct call.<br>There may be issues of position-independence, but on AMD64 this<br>is not relevant. On AMD64_NT, I believe the vast majority of<br>code is naturally position-indendent via RIP-relative addressing.<br>It is true that things like vtables might have relocs.<br>I think that is unfortunate. It would be nice to have 100%<br>position independence for .dlls and .exes.<br> <br>On Linux, if you are compiling for a .dll, you must be position-independent,<br>I think fully, and all function calls by default go through the PLT.<br>Maybe to statics don't. But just sharing across two source files does.<br>Every call is therefore indirect, subject to loader machinations at<br>either load or first-call time, and "interposable" -- someone else<br>can export a function of the same name and take over the function.<br>As well, someone else can call these internal functions more easily<br>than otherwise. Granted, anyone can call any of your code at any time, just<br>by jumping to it. But symbolic exports are considered more attackable<br>surface area than random code sitting in memory.<br><br>If you don't use -fPIC, I think all calls are direct.<br>And you can't link into a .dll.<br><br>And then, really, the truth is in between.<br>Individual calls can be marked one way or the other.<br><br>But Modula-3 is marking everything as public, exported, subject<br>to dynamic linking, called through the PLT.<br><br>As to why only AMD64_LINUX is seeing this, I don't know.<br>I'd have to check how the static link is passed on others and<br>if the loader preserves it. Could be it is an extra parameter<br>on the stack, since x86 has so few registers.<br><br>Could be AMD64_LINUX could/should pass it another way, but<br>really, avoiding the PLT for unexported functions seems like<br>pure goodness.<br><br>I was quite surprised and dismayed to learn about all this last<br>night when I was debugging.<br><br>Why must inline function bodies for unexported functions be preserved<br>anyway? They are just dead code, right?<span class="Apple-converted-space"> </span><br>Is there another way to preserve them?<br>If it is <*inline*> on the implementation but listed in the *.i3 file, that should be public/exported. Is it not? I was able to build LINUXLIBC6 this way as far as building on AMD64 gets, which is pretty far -- eventually failing for lack of some X .libs.<br>Oh, I guess I should be sure optimization is on? I didn't twiddle that. I can try again.<br> <br> - Jay<br><br><blockquote><hr>From:<span class="Apple-converted-space"> </span><a href="mailto:hosking@cs.purdue.edu">hosking@cs.purdue.edu</a><br>To:<span class="Apple-converted-space"> </span><a href="mailto:jkrell@elegosoft.com">jkrell@elegosoft.com</a><br>Date: Tue, 29 Apr 2008 11:52:24 -0400<br>CC:<span class="Apple-converted-space"> </span><a href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</a><br>Subject: [M3devel] Your recent change to parse.c<br><br><div>I don't understand your change to parse.c re TREE_PUBLIC being set on procedure declarations.  TREE_PUBLIC just means that it is possible to call the procedure from outside the current compilation unit.  It has nothing to do with intra-library visibility.</div><div><br></div><br><div><span class="EC_Apple-style-span" style="word-spacing: 0px; font: normal normal normal 12px/normal Helvetica; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><div style="word-wrap: break-word; "><span class="EC_Apple-style-span" style="word-spacing: 0px; font: normal normal normal 12px/normal Helvetica; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><span class="EC_Apple-style-span" style="word-spacing: 0px; font: normal normal normal 12px/normal Helvetica; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><span class="EC_Apple-style-span" style="word-spacing: 0px; font: normal normal normal 12px/normal Helvetica; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><span class="EC_Apple-style-span" style="word-spacing: 0px; font: normal normal normal 12px/normal Helvetica; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><span class="EC_Apple-style-span" style="word-spacing: 0px; font: normal normal normal 12px/normal Helvetica; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><span class="EC_Apple-style-span" style="word-spacing: 0px; font: normal normal normal 12px/normal Helvetica; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><span class="EC_Apple-style-span" style="word-spacing: 0px; font: normal normal normal 12px/normal Helvetica; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><span class="EC_Apple-style-span" style="word-spacing: 0px; font: normal normal normal 12px/normal Helvetica; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><div><font class="EC_Apple-style-span" color="#0000ff"><font class="EC_Apple-style-span" face="Gill Sans"><span class="EC_Apple-style-span" style="color: rgb(0, 0, 255); font-family: 'Gill Sans'; "><span class="EC_Apple-style-span" style="color: rgb(0, 0, 255); font-family: 'Gill Sans'; ">Antony Hosking</span></span></font></font><font class="EC_Apple-style-span" face="Gill Sans"><span class="EC_Apple-style-span" style="font-family: 'Gill Sans'; "><span class="EC_Apple-style-span" style="font-family: 'Gill Sans'; "><span class="Apple-converted-space"> </span>|<span class="Apple-converted-space"> </span></span></span><span class="EC_Apple-style-span" style="font-family: 'Gill Sans'; "><span class="EC_Apple-style-span" style="font-family: 'Gill Sans'; ">Associate Professor</span></span><span class="EC_Apple-style-span" style="font-family: 'Gill Sans'; "><span class="EC_Apple-style-span" style="font-family: 'Gill Sans'; "> | Computer Science | Purdue University</span></span></font></div><div><font class="EC_Apple-style-span" face="GillSans-Light"><span class="EC_Apple-style-span" style="font-family: GillSans-Light; ">305 N. University Street | West Lafayette | IN 47907 | USA</span></font></div><div><font class="EC_Apple-style-span" face="Gill Sans" color="#0000ff"><span class="EC_Apple-style-span" style="color: rgb(0, 0, 255); font-family: 'Gill Sans'; "><span class="EC_Apple-style-span" style="color: rgb(0, 0, 255); font-family: 'Gill Sans'; ">Office</span></span></font><font class="EC_Apple-style-span" face="GillSans-Light"><span class="EC_Apple-style-span" style="font-family: GillSans-Light; "><span class="EC_Apple-style-span" style="font-family: GillSans-Light; "> +1 765 494 6001 |<span class="Apple-converted-space"> </span></span></span></font><font class="EC_Apple-style-span" face="Gill Sans" color="#0000ff"><span class="EC_Apple-style-span" style="color: rgb(0, 0, 255); font-family: 'Gill Sans'; "><span class="EC_Apple-style-span" style="color: rgb(0, 0, 255); font-family: 'Gill Sans'; ">Mobile</span></span></font><font class="EC_Apple-style-span" face="GillSans-Light"><span class="EC_Apple-style-span" style="font-family: GillSans-Light; "><span class="EC_Apple-style-span" style="font-family: GillSans-Light; "><span class="Apple-converted-space"> </span>+1 765 427 5484</span></span></font></div><div><font class="EC_Apple-style-span" face="GillSans-Light"><br class="EC_khtml-block-placeholder"></font></div></span></span></span></span></span></span></span><br class="EC_Apple-interchange-newline"></span></div></span></div><br></blockquote></div></span><br class="Apple-interchange-newline"></blockquote></div><br></div></body></html>