[LLVMdev] clang-llvm exceptions problem powerpc-apple-darwin

Peter Lawrence peterl95124 at sbcglobal.net
Tue Jul 5 18:26:54 PDT 2011


I am getting assembler errors on clang-llvm-2.9 output for a program  
with
exceptions that I do not get when using the installed g++

Mac OS-X 10.4  powerpc-apple-darwin

 > as -version
Apple Computer, Inc. version cctools-590.23.2.obj~17, GNU assembler  
version 1.38

the folks at gnu-binutils assure me this is an assembler bug, but  
also that this isn't
a recognizable "gnu" version number for gas.

1) ----------
this has to be a well know problem with the apple powerpc assembler,
is there an upgrade ?  or is there a version of gnu-binutils that is  
consistent
with Apple/MachO/OSX-10.4 that I can build myself ?


2) ----------
I still have not been able to figure out in detail how g++ avoids  
hitting this
assembler bug.  I am able to modifying by hand the clang-llvm  output  
to work
around the problem, doing this transformation

Ltmp123 = Label1 - Label2
	.long Ltmp123

gets turned into this

	.long Label1 - Label2

unfortunately always doing one or always doing the other causes either
assembler errors or linker errors. the transformation has to be applied
very selectively...


3) ----------
so far I am unsuccessful in modifying llvm to work around the problem,
I have tried all the variations below, and always end up with either
assembler or linker errors


void AsmPrinter::EmitReference(const MCSymbol *Sym, unsigned  
Encoding) const {
   const TargetLoweringObjectFile &TLOF = getObjFileLowering();

   const MCExpr *Exp =
     TLOF.getExprForDwarfReference(Sym, Mang, MMI, Encoding,  
OutStreamer);

   const MCSectionMachO * SecCur = dyn_cast<MCSectionMachO> 
(getCurrentSection());
   const MCSectionMachO * SecRef = dyn_cast<MCSectionMachO>(&Sym- 
 >getSection());

#if 0
   OutStreamer.EmitAbsValue(Exp, GetSizeOfEncodedValue(Encoding));
#elif 0
   if (SecRef->getType() == MCSectionMachO::S_COALESCED)
     OutStreamer.EmitValue(Exp, GetSizeOfEncodedValue(Encoding));
   else
     OutStreamer.EmitAbsValue(Exp, GetSizeOfEncodedValue(Encoding));
#else
   if (SecCur->getType() == MCSectionMachO::S_COALESCED ||
       SecRef->getType() == MCSectionMachO::S_COALESCED)
     OutStreamer.EmitValue(Exp, GetSizeOfEncodedValue(Encoding));
   else
     OutStreamer.EmitAbsValue(Exp, GetSizeOfEncodedValue(Encoding));
#endif
}


if anyone has any insight into g++'s selective use of ".set A-B"  
verses ".long A-B"
I would appreciate hearing about it ?


thanks,
Peter Lawrence.






More information about the llvm-dev mailing list