[LLVMdev] MCELFStreamer subclassing
Jim Grosbach
grosbach at apple.com
Tue Nov 15 10:24:17 PST 2011
Hi Jack,
I'm not 100% up on how MIPS represents jump tables, so take with a grain of salt and all that.
Normally how this stuff works is that the streamer will create Fixups (MCDataFragment::addFixup()) for anything that might require a relocation. That may come from the generic streamer stuff (see MCObjectStreamer::EmitValueImpl() for example), or from the target's MCCodeEmitter (for any target-specific fixups in code, for example). Then the object streamer resolves those fixups, directly if it can or via relocations otherwise via the MCObjectWriter::RecordRelocation() hook. For MachO, that's been moved to a target hook, but for ELF that's directly in ELFObjectWriter.cpp still, including all the target specific bits.
For your specific problem, I suspect what needs to happen is something like:
1) In MCELFStreamer(), implement EmitGPRel32Value() to add an appropriate fixup, and
2) in ELFObjectWriter.cpp, teach the Mips bits what relocation type to use for that fixup, if it doesn't know already. (MipsELFObjectWriter::GetRelocType()).
Regards,
-Jim
On Nov 15, 2011, at 9:57 AM, Carter, Jack wrote:
> Well Jim, that may just be my problem.
>
> As background I am working on the outer reaches of llvm for the direct object output for Mips. Part of what I am to do is instruct the folks working closer to the backend what I am getting that is incorrect. My first reaction is to assume that I am being fed things the correct way and that I am not handling it correctly.
>
> I feed the compiler a source file (attached) -O0 that untilizes a switch statement. This produces, in Mips, an rodata section with gp relative relocations associated with it. I know this because that is what I get when producing a .s file and then running gas on it. When compiling for direct object output I got the error stemming from MCStreamer.
>
> Since we are using MCELFStreamer, my assumption (possibly/probably wrong) was that we needed to subclass MCELFStreamer to somehow set the magic flag so that the relocation get generated.
>
> in AsmPrinter::EmitJumpTableEntry, MJTI->getEntryKind() is of type EK_GPRel32BlockAddress.
>
> Any insight is appreciated. I am rereading the llvm documentation. Right now it is magic to me and need to have the magic turn into knowledge.
>
> Thanks,
>
> Jack
> ________________________________________
> From: Jim Grosbach [grosbach at apple.com]
> Sent: Tuesday, November 15, 2011 8:57 AM
> To: Carter, Jack
> Cc: llvmdev at cs.uiuc.edu List; Daniel Dunbar
> Subject: Re: [LLVMdev] MCELFStreamer subclassing
>
> Hi Jack,
>
> Can you elaborate a bit on what you're trying to do? Relocations are handled by the ObjectWriter interfaces, not by the streamer. The <ObjectFormat>Streamer classes aren't intended to be subclassed by targets.
>
> -Jim
>
> On Nov 14, 2011, at 5:50 PM, Carter, Jack wrote:
>
>> I need to create a subclass that derives from MCELFStreamer.
>>
>> We use MCELFStreamer for direct object generation and need to override a virtual method in the base class MCStreamer::EmitGPRel32Value().
>>
>> I have been having trouble creating the subclass due to #include issues. I can't seem to get it right at the lib/target/<my target>/MCTargetDesc level. My first thought is always that I am doing something wrong and that may still be the issue, but it is suspicious that no one has subclassed MCELFStreamer yet.
>>
>> Am I missing something obvious or is this class in need of header file reorganization?
>>
>> Any constructive suggestion is welcome. I need to get my gp relative data relocations generated :-)
>>
>> Jack
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
> <switch.c>
More information about the llvm-dev
mailing list