[LLVMdev] Problem with Linux PPC64 assembly output.

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:
        .quad .L.__umodsi3,.TOC. at tocbase
        mflr 0
        mtlr 0
        .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();

    const MCExpr *SizeExp =
      MCBinaryExpr::CreateSub(MCSymbolRefExpr::Create(FnEndLabel, 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?


More information about the llvm-dev mailing list