1//===- lib/MC/MCObjectWriter.cpp - MCObjectWriter implementation ----------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9
| 1//===- lib/MC/MCObjectWriter.cpp - MCObjectWriter implementation ----------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9
|
| 10#include "llvm/MC/MCAssembler.h" 11#include "llvm/MC/MCExpr.h"
|
10#include "llvm/MC/MCObjectWriter.h"
| 12#include "llvm/MC/MCObjectWriter.h"
|
| 13#include "llvm/MC/MCSymbol.h"
|
11 12using namespace llvm; 13 14MCObjectWriter::~MCObjectWriter() { 15}
| 14 15using namespace llvm; 16 17MCObjectWriter::~MCObjectWriter() { 18}
|
| 19 20/// Utility function to encode a SLEB128 value. 21void MCObjectWriter::EncodeSLEB128(int64_t Value, raw_ostream &OS) { 22 bool More; 23 do { 24 uint8_t Byte = Value & 0x7f; 25 // NOTE: this assumes that this signed shift is an arithmetic right shift. 26 Value >>= 7; 27 More = !((((Value == 0 ) && ((Byte & 0x40) == 0)) || 28 ((Value == -1) && ((Byte & 0x40) != 0)))); 29 if (More) 30 Byte |= 0x80; // Mark this byte that that more bytes will follow. 31 OS << char(Byte); 32 } while (More); 33} 34 35/// Utility function to encode a ULEB128 value. 36void MCObjectWriter::EncodeULEB128(uint64_t Value, raw_ostream &OS) { 37 do { 38 uint8_t Byte = Value & 0x7f; 39 Value >>= 7; 40 if (Value != 0) 41 Byte |= 0x80; // Mark this byte that that more bytes will follow. 42 OS << char(Byte); 43 } while (Value != 0); 44} 45 46bool 47MCObjectWriter::IsSymbolRefDifferenceFullyResolved(const MCAssembler &Asm, 48 const MCSymbolRefExpr *A, 49 const MCSymbolRefExpr *B, 50 bool InSet) const { 51 // Modified symbol references cannot be resolved. 52 if (A->getKind() != MCSymbolRefExpr::VK_None || 53 B->getKind() != MCSymbolRefExpr::VK_None) 54 return false; 55 56 const MCSymbol &SA = A->getSymbol(); 57 const MCSymbol &SB = B->getSymbol(); 58 if (SA.AliasedSymbol().isUndefined() || SB.AliasedSymbol().isUndefined()) 59 return false; 60 61 const MCSymbolData &DataA = Asm.getSymbolData(SA); 62 const MCSymbolData &DataB = Asm.getSymbolData(SB); 63 64 return IsSymbolRefDifferenceFullyResolvedImpl(Asm, DataA, 65 *DataB.getFragment(), 66 InSet, 67 false); 68} 69 70bool 71MCObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm, 72 const MCSymbolData &DataA, 73 const MCFragment &FB, 74 bool InSet, 75 bool IsPCRel) const { 76 const MCSection &SecA = DataA.getSymbol().AliasedSymbol().getSection(); 77 const MCSection &SecB = FB.getParent()->getSection(); 78 // On ELF and COFF A - B is absolute if A and B are in the same section. 79 return &SecA == &SecB; 80}
|
| |