Mercurial > hg > CbC > CbC_llvm
diff lib/Target/X86/X86TargetObjectFile.cpp @ 147:c2174574ed3a
LLVM 10
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 14 Aug 2019 16:55:33 +0900 |
parents | 3a76565eade5 |
children |
line wrap: on
line diff
--- a/lib/Target/X86/X86TargetObjectFile.cpp Sat Feb 17 09:57:20 2018 +0900 +++ b/lib/Target/X86/X86TargetObjectFile.cpp Wed Aug 14 16:55:33 2019 +0900 @@ -1,9 +1,8 @@ //===-- X86TargetObjectFile.cpp - X86 Object Info -------------------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// @@ -91,100 +90,3 @@ TargetLoweringObjectFileELF::Initialize(Ctx, TM); InitializeELF(TM.Options.UseInitArray); } - -const MCExpr *X86WindowsTargetObjectFile::lowerRelativeReference( - const GlobalValue *LHS, const GlobalValue *RHS, - const TargetMachine &TM) const { - // Our symbols should exist in address space zero, cowardly no-op if - // otherwise. - if (LHS->getType()->getPointerAddressSpace() != 0 || - RHS->getType()->getPointerAddressSpace() != 0) - return nullptr; - - // Both ptrtoint instructions must wrap global objects: - // - Only global variables are eligible for image relative relocations. - // - The subtrahend refers to the special symbol __ImageBase, a GlobalVariable. - // We expect __ImageBase to be a global variable without a section, externally - // defined. - // - // It should look something like this: @__ImageBase = external constant i8 - if (!isa<GlobalObject>(LHS) || !isa<GlobalVariable>(RHS) || - LHS->isThreadLocal() || RHS->isThreadLocal() || - RHS->getName() != "__ImageBase" || !RHS->hasExternalLinkage() || - cast<GlobalVariable>(RHS)->hasInitializer() || RHS->hasSection()) - return nullptr; - - return MCSymbolRefExpr::create(TM.getSymbol(LHS), - MCSymbolRefExpr::VK_COFF_IMGREL32, - getContext()); -} - -static std::string APIntToHexString(const APInt &AI) { - unsigned Width = (AI.getBitWidth() / 8) * 2; - std::string HexString = utohexstr(AI.getLimitedValue(), /*LowerCase=*/true); - unsigned Size = HexString.size(); - assert(Width >= Size && "hex string is too large!"); - HexString.insert(HexString.begin(), Width - Size, '0'); - - return HexString; -} - -static std::string scalarConstantToHexString(const Constant *C) { - Type *Ty = C->getType(); - if (isa<UndefValue>(C)) { - return APIntToHexString(APInt::getNullValue(Ty->getPrimitiveSizeInBits())); - } else if (const auto *CFP = dyn_cast<ConstantFP>(C)) { - return APIntToHexString(CFP->getValueAPF().bitcastToAPInt()); - } else if (const auto *CI = dyn_cast<ConstantInt>(C)) { - return APIntToHexString(CI->getValue()); - } else { - unsigned NumElements; - if (isa<VectorType>(Ty)) - NumElements = Ty->getVectorNumElements(); - else - NumElements = Ty->getArrayNumElements(); - std::string HexString; - for (int I = NumElements - 1, E = -1; I != E; --I) - HexString += scalarConstantToHexString(C->getAggregateElement(I)); - return HexString; - } -} - -MCSection *X86WindowsTargetObjectFile::getSectionForConstant( - const DataLayout &DL, SectionKind Kind, const Constant *C, - unsigned &Align) const { - if (Kind.isMergeableConst() && C) { - const unsigned Characteristics = COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | - COFF::IMAGE_SCN_MEM_READ | - COFF::IMAGE_SCN_LNK_COMDAT; - std::string COMDATSymName; - if (Kind.isMergeableConst4()) { - if (Align <= 4) { - COMDATSymName = "__real@" + scalarConstantToHexString(C); - Align = 4; - } - } else if (Kind.isMergeableConst8()) { - if (Align <= 8) { - COMDATSymName = "__real@" + scalarConstantToHexString(C); - Align = 8; - } - } else if (Kind.isMergeableConst16()) { - if (Align <= 16) { - COMDATSymName = "__xmm@" + scalarConstantToHexString(C); - Align = 16; - } - } else if (Kind.isMergeableConst32()) { - if (Align <= 32) { - COMDATSymName = "__ymm@" + scalarConstantToHexString(C); - Align = 32; - } - } - - if (!COMDATSymName.empty()) - return getContext().getCOFFSection(".rdata", Characteristics, Kind, - COMDATSymName, - COFF::IMAGE_COMDAT_SELECT_ANY); - } - - return TargetLoweringObjectFile::getSectionForConstant(DL, Kind, C, Align); -}