[LLVMdev] Problem with Linux PPC64 assembly output. (original) (raw)

Richard Pennington rich at pennware.com
Sat Sep 17 14:20:26 PDT 2011


The latest binutils (2.21.2) assembler for the PPC64 complains about the .size directive emitted by LLVM as not containing an absolute expression.

An example: __umodsi3: .quad .L.__umodsi3,.TOC. at tocbase .previous .L.__umodsi3: mflr 0 [snip] mtlr 0 blr .Ltmp0: .size __umodsi3, .Ltmp0-__umodsi3

The correct size expression should be .Ltmp0-.L.__umodsi3

The code which does this is in AsmPrinter.cpp:

// If the target wants a .size directive for the size of the function, emit // it. if (MAI->hasDotTypeDotSizeDirective()) { // Create a symbol for the end of function, so we can get the size as // difference between the function label and the temp label. MCSymbol *FnEndLabel = OutContext.CreateTempSymbol(); OutStreamer.EmitLabel(FnEndLabel);

const MCExpr *SizeExp =
  MCBinaryExpr::CreateSub(MCSymbolRefExpr::Create(FnEndLabel, OutContext),
                          MCSymbolRefExpr::Create(CurrentFnSym, 

OutContext), OutContext); OutStreamer.EmitELFSize(CurrentFnSym, SizeExp); }

I've filed a bug for this: http://llvm.org/bugs/show_bug.cgi?id=10951

This looks a little tricky to fix since there is no easy hook that I can find to override how the .size directive is output.

Anyone have any suggestions, or have I missed something?

-Rich



More information about the llvm-dev mailing list