diff options
author | James Y Knight <jyknight@google.com> | 2015-06-18 15:05:15 +0000 |
---|---|---|
committer | James Y Knight <jyknight@google.com> | 2015-06-18 15:05:15 +0000 |
commit | f90346f8f6ebd4ce4589ba070e4baaeede80988a (patch) | |
tree | d42569f06e42c11e8915b81a6789d0c50cbded83 /llvm/lib/Target/Sparc/AsmParser | |
parent | 3645149ea23ed708f08a333065327307dda1221e (diff) | |
download | bcm5719-llvm-f90346f8f6ebd4ce4589ba070e4baaeede80988a.tar.gz bcm5719-llvm-f90346f8f6ebd4ce4589ba070e4baaeede80988a.zip |
[SPARC] Repair GOT references to internal symbols.
They had been getting emitted as a section + offset reference, which
is bogus since the value needs to be the offset within the GOT, not
the actual address of the symbol's object.
Differential Revision: http://reviews.llvm.org/D10441
llvm-svn: 240020
Diffstat (limited to 'llvm/lib/Target/Sparc/AsmParser')
-rw-r--r-- | llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp b/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp index 021f904f6ee..4a33f7fc346 100644 --- a/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp +++ b/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp @@ -947,6 +947,8 @@ bool SparcAsmParser::matchRegisterName(const AsmToken &Tok, return false; } +// Determine if an expression contains a reference to the symbol +// "_GLOBAL_OFFSET_TABLE_". static bool hasGOTReference(const MCExpr *Expr) { switch (Expr->getKind()) { case MCExpr::Target: @@ -998,6 +1000,13 @@ bool SparcAsmParser::matchSparcAsmModifiers(const MCExpr *&EVal, bool isPIC = getContext().getObjectFileInfo()->getRelocM() == Reloc::PIC_; + // Ugly: if a sparc assembly expression says "%hi(...)" but the + // expression within contains _GLOBAL_OFFSET_TABLE_, it REALLY means + // %pc22. Same with %lo -> %pc10. Worse, if it doesn't contain that, + // the meaning depends on whether the assembler was invoked with + // -KPIC or not: if so, it really means %got22/%got10; if not, it + // actually means what it said! Sigh, historical mistakes... + switch(VK) { default: break; case SparcMCExpr::VK_Sparc_LO: |