Index: MCExternalSymbolizer.cpp =================================================================== --- MCExternalSymbolizer.cpp (revision 183949) +++ MCExternalSymbolizer.cpp (working copy) @@ -11,6 +11,7 @@ #include "llvm/MC/MCContext.h" #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCInst.h" +#include "llvm/MC/MCSymbol.h" #include "llvm/Support/raw_ostream.h" #include @@ -59,7 +60,7 @@ } // For branches always create an MCExpr so it gets printed as hex address. else if (IsBranch) { - SymbolicOp.Value = Value; + SymbolicOp.Value = Value - Address - Offset - InstSize; } if(ReferenceType == LLVMDisassembler_ReferenceType_Out_SymbolStub) cStream << "symbol stub for: " << ReferenceName; @@ -72,6 +73,10 @@ if (SymbolicOp.AddSymbol.Name) { StringRef Name(SymbolicOp.AddSymbol.Name); MCSymbol *Sym = Ctx.GetOrCreateSymbol(Name); + uint64_t ImmVal = Value - Address - Offset - InstSize; + const MCExpr *ImmExpr = MCConstantExpr::Create(ImmVal, Ctx); + if(!Sym->isUsed()) + Sym->setVariableValue(ImmExpr); Add = MCSymbolRefExpr::Create(Sym, Ctx); } else { Add = MCConstantExpr::Create((int)SymbolicOp.AddSymbol.Value, Ctx); @@ -83,6 +88,10 @@ if (SymbolicOp.SubtractSymbol.Name) { StringRef Name(SymbolicOp.SubtractSymbol.Name); MCSymbol *Sym = Ctx.GetOrCreateSymbol(Name); + uint64_t ImmVal = Value - Address - Offset - InstSize; + const MCExpr *ImmExpr = MCConstantExpr::Create(ImmVal, Ctx); + if(!Sym->isUsed()) + Sym->setVariableValue(ImmExpr); Sub = MCSymbolRefExpr::Create(Sym, Ctx); } else { Sub = MCConstantExpr::Create((int)SymbolicOp.SubtractSymbol.Value, Ctx);