[llvm] r293936 - Change how we handle section symbols on ELF.

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 10 05:38:32 PST 2017


Sorry, I missed your first reply. Taking a look at the xcore testcase.

Cheers,
Rafael

Mikael Holmén <mikael.holmen at ericsson.com> writes:

> Hi Rafael,
>
> Did you have any opinion about this?
>
> The small reproducer further down in the mail crashes on xcore.
>
> Regards,
> Mikael
>
>
>  > llc -O0 -march=xcore foo.ll -o -
>  >
>  > on
>  >
>  > @bar = internal global i32 zeroinitializer
>  >
>  > define void @".dp.bss"() {
>  >   ret void
>  > }
>
>
> On 02/06/2017 09:37 AM, Mikael Holmén wrote:
>>
>>
>> On 02/03/2017 03:50 PM, Rafael Avila de Espindola wrote:
>>> Mikael Holmén <mikael.holmen at ericsson.com> writes:
>>>
>>>> Hi Rafael,
>>>>
>>>> I have a question about this change.
>>> ...
>>>>> This patch includes a few hacks to avoid changing our behaviour when
>>>>> handling conflicts between section symbols and other symbols. I
>>>>> reported pr31850 to track that.
>>>>
>>>> For my out-of-tree backend, we output all code in a section called
>>>> exactly "code". With your patch we now run into the below problem if we
>>>> then also have a function called "code".
>>>>
>>>> For foo.ll:
>>>>
>>>> define void @code() {
>>>>    ret void
>>>> }
>>>>
>>>> If I do
>>>>
>>>> build/bin/llc -O0 -mtriple phoenix foo.ll -o -
>>>>
>>>> we get
>>>>
>>>>          .section code
>>>> __FILE_START:
>>>>          .global code
>>>> llc: ../lib/MC/MCAsmStreamer.cpp:440: virtual void (anonymous
>>>> namespace)::MCAsmStreamer::EmitLabel(llvm::MCSymbol *): Assertion
>>>> `Symbol->isUndefined() && "Cannot define a symbol twice!"' failed.
>>>>
>>>> So now we seem to get a clash between the section and function names,
>>>> and the assertion fails.
>>>>
>>>> I suppose this was not intended or are we doing something stupid in our
>>>> backend?
>>>
>>> It was not the intention to change it. What is line 440 for you?
>>
>> Ah, sorry.
>>
>> It's the assert on the first line in EmitLabel below that blows:
>>
>> void MCAsmStreamer::EmitLabel(MCSymbol *Symbol) {
>>   assert(Symbol->isUndefined() && "Cannot define a symbol twice!");
>>   MCStreamer::EmitLabel(Symbol);
>>
>>   Symbol->print(OS, MAI);
>>   OS << MAI->getLabelSuffix();
>>
>>   EmitEOL();
>> }
>>
>> We have setup our "code" section with this in our *TargetObjectFile.cpp:
>>
>>   // .text
>>   TextSection = Ctx.getELFSection("code", ELF::SHT_LOUSER + 0,
>>                                   ELF::SHF_ALLOC | ELF::SHF_EXECINSTR);
>>
>>> Upstream it is just an empty line.
>>>
>>> I tried to reproduce the problem with
>>>
>>> define void @".text"() {
>>>   ret void
>>> }
>>>
>>> but that doesn't crash and the function symbol takes precedence over the
>>> text one.
>>
>> If I do
>>
>> llc -O0 -march=xcore foo.ll -o -
>>
>> on
>>
>> @bar = internal global i32 zeroinitializer
>>
>> define void @".dp.bss"() {
>>   ret void
>> }
>>
>> then I get the same crash for xcore.
>>
>> Regards,
>> Mikael
>>
>>>
>>> Cheers,
>>> Rafael
>>>
>>


More information about the llvm-commits mailing list