On 18.12.2015 10:27, David Wohlferd wrote: > On 12/17/2015 11:30 AM, Bernd Edlinger wrote: >> On Thu, 17 Dec 2015 15:13:07, Bernd Schmidt wrote: >>>> What's your take on making -Wonly-top-basic-asm a default >>>> (either now or >>>> v7)? Is making it a non-default a waste of time because no one >>>> will >>>> ever see it? Or is making it a default too aggressive? What about >>>> adding it to -Wall? >>> Depends if anyone has one in system headers I guess. We could try to >>> add it to -Wall. >> Sorry, but if I have to object. >> >> Adding this warning to -Wall is too quickly and will bring the ia64, >> tilegx and mep ports into trouble. > > It doesn't look to me like adding the warnings will affect gcc > itself. But I do see how it could have an impact on people using gcc > on those platforms, if the warning causes them to convert to extended > asm. >
At least we should not start a panic until we have really understood all the details, how to do that. >> Each of them invokes some special semantics for basic asm: > > I'm collecting these for my "How to convert basic asm to extended asm" > document. This may need to go in the gcc wiki instead of the user > guide, since people may find important conversion tips like these > asynchronous to gcc's releases. > >> mep: mep_interrupt_saved_reg looks for ASM_INPUT in the body, and >> saves different registers if found. > > I'm trying to follow this code. A real challenge since I know nothing > about mep. But what I see is: > > - This routine only applies to functions marked as > __attribute__((interrupt)). > - To correctly generate entry/exit, it walks thru each register (up to > FIRST_PSEUDO_REGISTER) to see if it is used by the routine. If there > is any basic asm within the routine (regardless of its contents), the > register is considered 'in use.' > > The net result is that every register gets saved/restored by the > entry/exit of this routine if it contains basic asm. The reason this > is important is that if someone just adds a colon, it would suddenly > *not* save/restore all the registers. Depending on what the asm does, > this could be bad. > > Does that sound about right? > Yes. > This is certainly worth mentioning in the 'convert' doc. > > I wonder how often this 'auto-clobber' feature is used, though. I > don't see it mentioned in the 'interrupt' attribute docs for mep, and > it's not in the basic asm docs either. If your interrupt doesn't need > many registers, it seems like you'd want to know this and possibly use > extended. And you'd really want to know if you are doing a > (redundant) push/pop in your interrupt. > >> tilegx: They never wrap {} around inline asm. But extended asm, are >> handled differently, probably automatically surrounded by braces. > > I know nothing about tilegx either. I've tried to read the code, and > it seems like basic asm does not get 'bundled' while extended might be. > > Bundling for tilegx (as I understand it) is when you explicitly fill > multiple pipelines by doing something like this: > > { add r3,r4,r5 ; add r7,r8,r9 ; lw r10,r11 } > > So if you have a basic asm statement, you wouldn't want it > automatically bundled by the compiler, since your asm could be more > than 3 statements (the max?). Or your asm may do its own bundling. So > it makes sense to never output braces when outputting basic asm. > > I know I'm guessing about what this means, but doesn't it seem like > those same limitations would apply to extended? I wonder if this is a > bug. I don't see any discussion of bundling (of this sort) in the docs. > I wold like to build a cross compiler, but currently that target seems to be broken. I have to check that target anyways, because of my other patch with the memory clobbers. I see in tilegx_asm_output_opcode, that they do somehow automatically place braces. An asm("pseudo":) has a special meaning, and can be replaced with "" or "}". However the static buf[100] means that any extended asm string > 95 characters, invokes the gcc_assert in line 5487. In the moment I would _not_ recommend changing any asm statements without very careful testing. >> ia64: ASM_INPUT emits stop-bits. extended asm does not the same. >> That was already mentioned by Segher. > > I already had this one from Segher's email. > > -------------------- > Given all this, I'm more convinced than ever of the value of > -Wonly-top-basic-asm. Basic asm is quirky, has undocumented bits and > its behavior is incompatible with other compilers, even though it uses > the same syntax. If I had any of this in my projects, I'd sure want > to find it and look it over. > > But maybe Bernd is right and it's best to leave the warning disabled > in v6, even by -Wall. I may ask this question again in the next phase > 1... > Aehm, yes, maybe the warning could by then be something more reasonable like: "Warning: the semantic of basic asm has changed to include implicit memory clobber, if you think that is a problem for you, please convert it to basic asm, otherwise just relax." > With that in mind, how do you feel about the basic plan: > > - Update the basic asm docs to describe basic asm's current (and > historical) semantics (ie clobber nothing). > - Emphasize how that might be different from users' expectations or > the behavior of other compilers. > - Warn that this could change in future versions of gcc. To avoid > impacts from this change, use extended. > - Reference the "How to convert from basic asm to extended asm" guide > (where ever it ends up living). > - Mention -Wonly-top-basic-asm as a way to locate affected statements. > - -Wonly-top-basic-asm is disabled by default and not enabled by -Wall > or -Wextra. > > Does this seem like a safe and useful change for v6? > Yes, but please add a test case with some examples where the warning is expected to be triggered, and where it is not. Thanks Bernd.