diff options
author | Daniel Dunbar <daniel@zuster.org> | 2011-04-29 18:10:47 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2011-04-29 18:10:47 +0000 |
commit | 29ba55cfe40e72e81b4d70703fd1c0e9ed7852cd (patch) | |
tree | 5a1b4c698978abd9bad7584a1a3c50ed9cc9598d /llvm/lib | |
parent | b9c2b6c50d6b1c1df9be15e6c24c12c956784a17 (diff) | |
download | bcm5719-llvm-29ba55cfe40e72e81b4d70703fd1c0e9ed7852cd.tar.gz bcm5719-llvm-29ba55cfe40e72e81b4d70703fd1c0e9ed7852cd.zip |
MC/Mach-O: Allow emission of relocations for variables in some more cases.
llvm-svn: 130520
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/MC/MachObjectWriter.cpp | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/llvm/lib/MC/MachObjectWriter.cpp b/llvm/lib/MC/MachObjectWriter.cpp index dde1c5d9830..8e9f46f7069 100644 --- a/llvm/lib/MC/MachObjectWriter.cpp +++ b/llvm/lib/MC/MachObjectWriter.cpp @@ -550,7 +550,7 @@ public: // Add the local offset, if needed. if (Base != &SD) Value += Layout.getSymbolOffset(&SD) - Layout.getSymbolOffset(Base); - } else if (Symbol->isInSection()) { + } else if (Symbol->isInSection() && !Symbol->isVariable()) { // The index is the section ordinal (1-based). Index = SD.getFragment()->getParent()->getOrdinal() + 1; IsExtern = 0; @@ -1028,17 +1028,17 @@ public: // FIXME! report_fatal_error("FIXME: relocations to absolute targets " "not yet implemented"); - } else if (SD->getSymbol().isVariable()) { - int64_t Res; - if (SD->getSymbol().getVariableValue()->EvaluateAsAbsolute( - Res, Layout, SectionAddress)) { - FixedValue = Res; - return; + } else { + // Resolve constant variables. + if (SD->getSymbol().isVariable()) { + int64_t Res; + if (SD->getSymbol().getVariableValue()->EvaluateAsAbsolute( + Res, Layout, SectionAddress)) { + FixedValue = Res; + return; + } } - report_fatal_error("unsupported relocation of variable '" + - SD->getSymbol().getName() + "'"); - } else { // Check whether we need an external or internal relocation. if (doesSymbolRequireExternRelocation(SD)) { IsExtern = 1; @@ -1129,17 +1129,17 @@ public: // FIXME: Currently, these are never generated (see code below). I cannot // find a case where they are actually emitted. Type = macho::RIT_Vanilla; - } else if (SD->getSymbol().isVariable()) { - int64_t Res; - if (SD->getSymbol().getVariableValue()->EvaluateAsAbsolute( - Res, Layout, SectionAddress)) { - FixedValue = Res; - return; + } else { + // Resolve constant variables. + if (SD->getSymbol().isVariable()) { + int64_t Res; + if (SD->getSymbol().getVariableValue()->EvaluateAsAbsolute( + Res, Layout, SectionAddress)) { + FixedValue = Res; + return; + } } - report_fatal_error("unsupported relocation of variable '" + - SD->getSymbol().getName() + "'"); - } else { // Check whether we need an external or internal relocation. if (doesSymbolRequireExternRelocation(SD)) { IsExtern = 1; |