[Bug target/94134] pdp11-aout puts initial variable into .text section rather than .data
casner at acm dot org
gcc-bugzilla@gcc.gnu.org
Wed Mar 11 20:14:03 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94134
--- Comment #9 from Stephen Casner <casner at acm dot org> ---
Thank you all for your prompt action on this bug. I have some comments and
questions if you are willing to help with my education about gcc internals:
1. pdp11-aout does not have a .lcommon or .lcomm section, just .text, .data and
.bss. But also I'm missing something about the concept of a NOSWITCH_SECTION
that you can't switch to with an assembler directive -- how do you tell the
assembler to assign a variable to that section if you don't emit a directive?
2. Good point about optimization possibly omitting the variables in my test
case. Of course, the variables were used in my real program where I first
observed this problem, and I was trying to reduce my test case to the minimum.
If I had tried optimization and seen them removed, I would have expanded the
test case.
3. The goal that I am working toward is to have gcc and ld work correctly for
the -msplit option in pdp11-aout. For that case, instructions and data are
stored in separate, overlapping 64KB address spaces, so even if a variable is
const it can't go in the .text section.
4. I assumed that putting switch_to_section in the ASM_OUTPUT_ALIGNED_LOCAL
function might not be legal since that is in the callback of a section so it
might confuse the state of the caller. But if that is valid, then switching to
bss_section is the right thing to do because pdp11-aout does have .bss.
Emitting the variable in whatever section was currently active is clearly
wrong.
5. Fixing the extra blank line for .globl is also good, but I was unsure why
the code was as it is. Also I didn't figure out how there was a tab before
.globl since it wasn't in the string constant.
6. I agree that verifying the generated assembly language is a sufficient
check. But the way I run this code now is in emulation using SimH.
7. Emitting the zero-initialized variable into .data when it happens to follow
a nonzero-initialized variable is also not correct, or at least suboptimal. If
there is a vary large uninitialized array, that would make the final executable
output file much larger. (OK, these days a full 64KB is still a pittance, but
on principal it's suboptimal.) Therefore, switching to .bss in
ASM_OUTPUT{_ALIGNED{,_DECL}_}_LOCAL is good.
8. When the variables are not static (hence global), then TREE_PUBLIC is true
so it is not assigned to the lcomm_section and instead falls through to be
assigned to the .data section. It seems that zero-initialized variables should
be assigned to the same section whether local or global. So I think we do need
a TARGET_ASM_SELECT_SECTION function for the pdp11-aout target implemented by a
pdp11_select_section function that looks at bss_initializer_p (decl) to choose
between .data and .bss. Or does it need anything more of the logic like this
from get_variable_section, or maybe define bss_noswitch_section to be
bss_section if that makes sense?
if (ADDR_SPACE_GENERIC_P (as)
&& !DECL_THREAD_LOCAL_P (decl)
&& !(prefer_noswitch_p && targetm.have_switchable_bss_sections)
&& bss_initializer_p (decl))
{
if (!TREE_PUBLIC (decl)
&& !((flag_sanitize & SANITIZE_ADDRESS)
&& asan_protect_global (decl)))
return lcomm_section;
if (bss_noswitch_section)
return bss_noswitch_section;
}
More information about the Gcc-bugs
mailing list