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/MC | |
| 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/MC')
| -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; | 

