[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