15ef31a039dbb9c36cfd78442b3554d1b6974ec4cChris Lattner//===-- LTOModule.cpp - LLVM Link Time Optimizer --------------------------===// 277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// 377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// The LLVM Compiler Infrastructure 477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// 577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// This file is distributed under the University of Illinois Open Source 677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// License. See LICENSE.TXT for details. 7b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar// 877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik//===----------------------------------------------------------------------===// 977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// 10b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar// This file implements the Link Time Optimization library. This library is 1177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// intended to be used by linker to optimize code at link time. 1277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// 1377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik//===----------------------------------------------------------------------===// 1477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 15ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik#include "LTOModule.h" 163eb445feb22647e867a339f4c59b0a716b03a21aNick Kledzik#include "llvm/Constants.h" 178b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson#include "llvm/LLVMContext.h" 1877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik#include "llvm/Module.h" 1977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik#include "llvm/Bitcode/ReaderWriter.h" 2038c4e535493363b96eac47af9e7c056530137beaRafael Espindola#include "llvm/MC/MCExpr.h" 2138c4e535493363b96eac47af9e7c056530137beaRafael Espindola#include "llvm/MC/MCInst.h" 2238c4e535493363b96eac47af9e7c056530137beaRafael Espindola#include "llvm/MC/MCStreamer.h" 23ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng#include "llvm/MC/MCSubtargetInfo.h" 2438c4e535493363b96eac47af9e7c056530137beaRafael Espindola#include "llvm/MC/MCSymbol.h" 2594b9550a32d189704a8eae55505edf62662c0534Evan Cheng#include "llvm/MC/MCTargetAsmParser.h" 265ff4bc20a131cdf6fd0706b7abd80e16efc2f0e7Bill Wendling#include "llvm/MC/SubtargetFeature.h" 275ff4bc20a131cdf6fd0706b7abd80e16efc2f0e7Bill Wendling#include "llvm/MC/MCParser/MCAsmParser.h" 280e6a052331f674dd70e28af41f654a7874405eabEvan Cheng#include "llvm/Target/TargetRegisterInfo.h" 299ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling#include "llvm/Support/CommandLine.h" 305ff4bc20a131cdf6fd0706b7abd80e16efc2f0e7Bill Wendling#include "llvm/Support/Host.h" 315ff4bc20a131cdf6fd0706b7abd80e16efc2f0e7Bill Wendling#include "llvm/Support/MemoryBuffer.h" 325ff4bc20a131cdf6fd0706b7abd80e16efc2f0e7Bill Wendling#include "llvm/Support/Path.h" 335ff4bc20a131cdf6fd0706b7abd80e16efc2f0e7Bill Wendling#include "llvm/Support/SourceMgr.h" 345ff4bc20a131cdf6fd0706b7abd80e16efc2f0e7Bill Wendling#include "llvm/Support/TargetRegistry.h" 355ff4bc20a131cdf6fd0706b7abd80e16efc2f0e7Bill Wendling#include "llvm/Support/TargetSelect.h" 365ff4bc20a131cdf6fd0706b7abd80e16efc2f0e7Bill Wendling#include "llvm/Support/system_error.h" 375ff4bc20a131cdf6fd0706b7abd80e16efc2f0e7Bill Wendling#include "llvm/ADT/OwningPtr.h" 385ff4bc20a131cdf6fd0706b7abd80e16efc2f0e7Bill Wendling#include "llvm/ADT/Triple.h" 3977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzikusing namespace llvm; 4077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 419ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingstatic cl::opt<bool> 429ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill WendlingEnableFPMAD("enable-fp-mad", 439ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::desc("Enable less precise MAD instructions to be generated"), 449ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::init(false)); 459ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 469ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingstatic cl::opt<bool> 479ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill WendlingDisableFPElim("disable-fp-elim", 489ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::desc("Disable frame pointer elimination optimization"), 499ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::init(false)); 509ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 519ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingstatic cl::opt<bool> 529ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill WendlingDisableFPElimNonLeaf("disable-non-leaf-fp-elim", 539ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::desc("Disable frame pointer elimination optimization for non-leaf funcs"), 549ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::init(false)); 559ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 569ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingstatic cl::opt<bool> 579ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill WendlingEnableUnsafeFPMath("enable-unsafe-fp-math", 589ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::desc("Enable optimizations that may decrease FP precision"), 599ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::init(false)); 609ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 619ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingstatic cl::opt<bool> 629ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill WendlingEnableNoInfsFPMath("enable-no-infs-fp-math", 639ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::desc("Enable FP math optimizations that assume no +-Infs"), 649ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::init(false)); 659ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 669ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingstatic cl::opt<bool> 679ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill WendlingEnableNoNaNsFPMath("enable-no-nans-fp-math", 689ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::desc("Enable FP math optimizations that assume no NaNs"), 699ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::init(false)); 709ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 719ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingstatic cl::opt<bool> 729ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill WendlingEnableHonorSignDependentRoundingFPMath("enable-sign-dependent-rounding-fp-math", 739ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::Hidden, 749ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::desc("Force codegen to assume rounding mode can change dynamically"), 759ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::init(false)); 769ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 779ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingstatic cl::opt<bool> 789ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill WendlingGenerateSoftFloatCalls("soft-float", 799ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::desc("Generate software floating point library calls"), 809ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::init(false)); 819ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 829ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingstatic cl::opt<llvm::FloatABI::ABIType> 839ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill WendlingFloatABIForCalls("float-abi", 849ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::desc("Choose float ABI type"), 859ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::init(FloatABI::Default), 869ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::values( 879ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling clEnumValN(FloatABI::Default, "default", 889ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling "Target default float ABI type"), 899ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling clEnumValN(FloatABI::Soft, "soft", 909ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling "Soft float ABI (implied by -soft-float)"), 919ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling clEnumValN(FloatABI::Hard, "hard", 929ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling "Hard float ABI (uses FP registers)"), 939ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling clEnumValEnd)); 949ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 959ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingstatic cl::opt<llvm::FPOpFusion::FPOpFusionMode> 969ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill WendlingFuseFPOps("fp-contract", 979ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::desc("Enable aggresive formation of fused FP ops"), 989ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::init(FPOpFusion::Standard), 999ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::values( 1009ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling clEnumValN(FPOpFusion::Fast, "fast", 1019ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling "Fuse FP ops whenever profitable"), 1029ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling clEnumValN(FPOpFusion::Standard, "on", 1039ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling "Only fuse 'blessed' FP ops."), 1049ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling clEnumValN(FPOpFusion::Strict, "off", 1059ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling "Only fuse FP ops when the result won't be effected."), 1069ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling clEnumValEnd)); 1079ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 1089ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingstatic cl::opt<bool> 1099ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill WendlingDontPlaceZerosInBSS("nozero-initialized-in-bss", 1109ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::desc("Don't place zero-initialized symbols into bss section"), 1119ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::init(false)); 1129ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 1139ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingstatic cl::opt<bool> 1149ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill WendlingEnableGuaranteedTailCallOpt("tailcallopt", 1159ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::desc("Turn fastcc calls into tail calls by (potentially) changing ABI."), 1169ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::init(false)); 1179ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 1189ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingstatic cl::opt<bool> 1199ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill WendlingDisableTailCalls("disable-tail-calls", 1209ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::desc("Never emit tail calls"), 1219ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::init(false)); 1229ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 1239ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingstatic cl::opt<unsigned> 1249ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill WendlingOverrideStackAlignment("stack-alignment", 1259ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::desc("Override default stack alignment"), 1269ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::init(0)); 1279ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 1289ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingstatic cl::opt<bool> 1299ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill WendlingEnableRealignStack("realign-stack", 1309ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::desc("Realign stack if needed"), 1319ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::init(true)); 1329ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 1339ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingstatic cl::opt<std::string> 1349ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill WendlingTrapFuncName("trap-func", cl::Hidden, 1359ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::desc("Emit a call to trap function rather than a trap instruction"), 1369ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::init("")); 1379ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 1389ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingstatic cl::opt<bool> 1399ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill WendlingEnablePIE("enable-pie", 1409ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::desc("Assume the creation of a position independent executable."), 1419ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::init(false)); 1429ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 1439ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingstatic cl::opt<bool> 1449ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill WendlingSegmentedStacks("segmented-stacks", 1459ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::desc("Use segmented stacks if possible."), 1469ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::init(false)); 1479ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 1489ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingstatic cl::opt<bool> 1499ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill WendlingUseInitArray("use-init-array", 1509ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::desc("Use .init_array instead of .ctors."), 1519ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling cl::init(false)); 1529ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 15335907e98626b33f6406dc498201fc59ced282c8aChad Rosierstatic cl::opt<unsigned> 15435907e98626b33f6406dc498201fc59ced282c8aChad RosierSSPBufferSize("stack-protector-buffer-size", cl::init(8), 15535907e98626b33f6406dc498201fc59ced282c8aChad Rosier cl::desc("Lower bound for a buffer to be considered for " 15635907e98626b33f6406dc498201fc59ced282c8aChad Rosier "stack protection")); 15735907e98626b33f6406dc498201fc59ced282c8aChad Rosier 15862cf01e4c5de703e7712c72d12f577153b373cbaBill WendlingLTOModule::LTOModule(llvm::Module *m, llvm::TargetMachine *t) 15962cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling : _module(m), _target(t), 16062cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling _context(*_target->getMCAsmInfo(), *_target->getRegisterInfo(), NULL), 16162cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling _mangler(_context, *_target->getTargetData()) {} 16262cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling 16362cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// isBitcodeFile - Returns 'true' if the file (or memory contents) is LLVM 16462cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// bitcode. 165b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbarbool LTOModule::isBitcodeFile(const void *mem, size_t length) { 16659324297650c12a8dccf1a7ad650a9e895fdc17eRoman Divacky return llvm::sys::IdentifyFileType((const char*)mem, length) 167b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar == llvm::sys::Bitcode_FileType; 16877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 16977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 170b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbarbool LTOModule::isBitcodeFile(const char *path) { 171b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar return llvm::sys::Path(path).isBitcodeFile(); 17277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 17377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 17462cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// isBitcodeFileForTarget - Returns 'true' if the file (or memory contents) is 17562cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// LLVM bitcode for the specified triple. 176b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbarbool LTOModule::isBitcodeFileForTarget(const void *mem, size_t length, 177b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar const char *triplePrefix) { 178b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar MemoryBuffer *buffer = makeBuffer(mem, length); 179b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar if (!buffer) 180b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar return false; 181b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar return isTargetMatch(buffer, triplePrefix); 18277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 18377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 184b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbarbool LTOModule::isBitcodeFileForTarget(const char *path, 185b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar const char *triplePrefix) { 1863ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer OwningPtr<MemoryBuffer> buffer; 1873ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer if (MemoryBuffer::getFile(path, buffer)) 188b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar return false; 1893ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer return isTargetMatch(buffer.take(), triplePrefix); 190ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik} 191ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik 19262cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// isTargetMatch - Returns 'true' if the memory buffer is for the specified 19362cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// target triple. 194b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbarbool LTOModule::isTargetMatch(MemoryBuffer *buffer, const char *triplePrefix) { 19534711747a1d2c8713e69333bacef1c880810e371Bill Wendling std::string Triple = getBitcodeTargetTriple(buffer, getGlobalContext()); 19634711747a1d2c8713e69333bacef1c880810e371Bill Wendling delete buffer; 197931d4c204390752b30d4459264f8786de95b36d8Bill Wendling return strncmp(Triple.c_str(), triplePrefix, strlen(triplePrefix)) == 0; 19877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 19977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 20062cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// makeLTOModule - Create an LTOModule. N.B. These methods take ownership of 20162cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// the buffer. 20262cf01e4c5de703e7712c72d12f577153b373cbaBill WendlingLTOModule *LTOModule::makeLTOModule(const char *path, std::string &errMsg) { 2033ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer OwningPtr<MemoryBuffer> buffer; 2043ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer if (error_code ec = MemoryBuffer::getFile(path, buffer)) { 205f2f516fc2680168caac9981a4dd17cc37c639c71Michael J. Spencer errMsg = ec.message(); 206b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar return NULL; 207f2f516fc2680168caac9981a4dd17cc37c639c71Michael J. Spencer } 208f19d7a7af3f10b6d43f9e8b0271f0f836a33d52cRafael Espindola return makeLTOModule(buffer.take(), errMsg); 20977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 21077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 211b4cc031a3e1306fea74c9211d50c5cde6d9a8cd5Rafael EspindolaLTOModule *LTOModule::makeLTOModule(int fd, const char *path, 212931d4c204390752b30d4459264f8786de95b36d8Bill Wendling size_t size, std::string &errMsg) { 213f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola return makeLTOModule(fd, path, size, size, 0, errMsg); 214f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola} 215f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola 216f21b1058a194f411000bdd8000a8b675a7874056Rafael EspindolaLTOModule *LTOModule::makeLTOModule(int fd, const char *path, 217f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola size_t file_size, 218f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola size_t map_size, 219f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola off_t offset, 220b4cc031a3e1306fea74c9211d50c5cde6d9a8cd5Rafael Espindola std::string &errMsg) { 221b4cc031a3e1306fea74c9211d50c5cde6d9a8cd5Rafael Espindola OwningPtr<MemoryBuffer> buffer; 222f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola if (error_code ec = MemoryBuffer::getOpenFile(fd, path, buffer, file_size, 223f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola map_size, offset, false)) { 224b4cc031a3e1306fea74c9211d50c5cde6d9a8cd5Rafael Espindola errMsg = ec.message(); 225b4cc031a3e1306fea74c9211d50c5cde6d9a8cd5Rafael Espindola return NULL; 226b4cc031a3e1306fea74c9211d50c5cde6d9a8cd5Rafael Espindola } 227f19d7a7af3f10b6d43f9e8b0271f0f836a33d52cRafael Espindola return makeLTOModule(buffer.take(), errMsg); 228b4cc031a3e1306fea74c9211d50c5cde6d9a8cd5Rafael Espindola} 229b4cc031a3e1306fea74c9211d50c5cde6d9a8cd5Rafael Espindola 230b06913dd183fe4d294b88a166d4180d3de660135Daniel DunbarLTOModule *LTOModule::makeLTOModule(const void *mem, size_t length, 231b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar std::string &errMsg) { 232b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar OwningPtr<MemoryBuffer> buffer(makeBuffer(mem, length)); 233b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar if (!buffer) 234b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar return NULL; 235f19d7a7af3f10b6d43f9e8b0271f0f836a33d52cRafael Espindola return makeLTOModule(buffer.take(), errMsg); 236ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik} 23777595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 2389ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendlingvoid LTOModule::getTargetOptions(TargetOptions &Options) { 2399ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling Options.LessPreciseFPMADOption = EnableFPMAD; 2409ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling Options.NoFramePointerElim = DisableFPElim; 2419ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling Options.NoFramePointerElimNonLeaf = DisableFPElimNonLeaf; 2429ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling Options.AllowFPOpFusion = FuseFPOps; 2439ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling Options.UnsafeFPMath = EnableUnsafeFPMath; 2449ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling Options.NoInfsFPMath = EnableNoInfsFPMath; 2459ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling Options.NoNaNsFPMath = EnableNoNaNsFPMath; 2469ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling Options.HonorSignDependentRoundingFPMathOption = 2479ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling EnableHonorSignDependentRoundingFPMath; 2489ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling Options.UseSoftFloat = GenerateSoftFloatCalls; 2499ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling if (FloatABIForCalls != FloatABI::Default) 2509ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling Options.FloatABIType = FloatABIForCalls; 2519ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling Options.NoZerosInBSS = DontPlaceZerosInBSS; 2529ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling Options.GuaranteedTailCallOpt = EnableGuaranteedTailCallOpt; 2539ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling Options.DisableTailCalls = DisableTailCalls; 2549ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling Options.StackAlignmentOverride = OverrideStackAlignment; 2559ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling Options.RealignStack = EnableRealignStack; 2569ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling Options.TrapFuncName = TrapFuncName; 2579ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling Options.PositionIndependentExecutable = EnablePIE; 2589ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling Options.EnableSegmentedStacks = SegmentedStacks; 2599ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling Options.UseInitArray = UseInitArray; 26035907e98626b33f6406dc498201fc59ced282c8aChad Rosier Options.SSPBufferSize = SSPBufferSize; 2619ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling} 2629ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling 263b06913dd183fe4d294b88a166d4180d3de660135Daniel DunbarLTOModule *LTOModule::makeLTOModule(MemoryBuffer *buffer, 264b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar std::string &errMsg) { 26538c4e535493363b96eac47af9e7c056530137beaRafael Espindola static bool Initialized = false; 26638c4e535493363b96eac47af9e7c056530137beaRafael Espindola if (!Initialized) { 26738c4e535493363b96eac47af9e7c056530137beaRafael Espindola InitializeAllTargets(); 268e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng InitializeAllTargetMCs(); 26938c4e535493363b96eac47af9e7c056530137beaRafael Espindola InitializeAllAsmParsers(); 27038c4e535493363b96eac47af9e7c056530137beaRafael Espindola Initialized = true; 27138c4e535493363b96eac47af9e7c056530137beaRafael Espindola } 272b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar 273b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // parse bitcode buffer 274f19d7a7af3f10b6d43f9e8b0271f0f836a33d52cRafael Espindola OwningPtr<Module> m(getLazyBitcodeModule(buffer, getGlobalContext(), 275f19d7a7af3f10b6d43f9e8b0271f0f836a33d52cRafael Espindola &errMsg)); 276f19d7a7af3f10b6d43f9e8b0271f0f836a33d52cRafael Espindola if (!m) { 277f19d7a7af3f10b6d43f9e8b0271f0f836a33d52cRafael Espindola delete buffer; 278b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar return NULL; 279f19d7a7af3f10b6d43f9e8b0271f0f836a33d52cRafael Espindola } 280b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar 281b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar std::string Triple = m->getTargetTriple(); 282b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar if (Triple.empty()) 2830173864d8a87d9243d304fbf91b556e20b5a32fcSebastian Pop Triple = sys::getDefaultTargetTriple(); 284b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar 285b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // find machine architecture for this module 286b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar const Target *march = TargetRegistry::lookupTarget(Triple, errMsg); 287b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar if (!march) 288b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar return NULL; 289b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar 290333ed454d0c20d0f4999f7c9a404688b254a0cb0Nick Lewycky // construct LTOModule, hand over ownership of module and target 291b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar SubtargetFeatures Features; 292276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng Features.getDefaultSubtargetFeatures(llvm::Triple(Triple)); 293b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar std::string FeatureStr = Features.getString(); 294276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng std::string CPU; 2958a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky TargetOptions Options; 2969ac0aaa6afe4162b4db32833f9f176ac05ce6f8fBill Wendling getTargetOptions(Options); 2978a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky TargetMachine *target = march->createTargetMachine(Triple, CPU, FeatureStr, 2988a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky Options); 29938c4e535493363b96eac47af9e7c056530137beaRafael Espindola LTOModule *Ret = new LTOModule(m.take(), target); 3003bb17380b1c87fa23ef9fe208ce6f56d352df611Bill Wendling if (Ret->parseSymbols(errMsg)) { 30138c4e535493363b96eac47af9e7c056530137beaRafael Espindola delete Ret; 30238c4e535493363b96eac47af9e7c056530137beaRafael Espindola return NULL; 30338c4e535493363b96eac47af9e7c056530137beaRafael Espindola } 304931d4c204390752b30d4459264f8786de95b36d8Bill Wendling 30538c4e535493363b96eac47af9e7c056530137beaRafael Espindola return Ret; 30677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 30777595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 30862cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// makeBuffer - Create a MemoryBuffer from a memory range. 30962cf01e4c5de703e7712c72d12f577153b373cbaBill WendlingMemoryBuffer *LTOModule::makeBuffer(const void *mem, size_t length) { 31059324297650c12a8dccf1a7ad650a9e895fdc17eRoman Divacky const char *startPtr = (const char*)mem; 31162cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling return MemoryBuffer::getMemBuffer(StringRef(startPtr, length), "", false); 31277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 31377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 31462cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// objcClassNameFromExpression - Get string that the data pointer points to. 315b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbarbool LTOModule::objcClassNameFromExpression(Constant *c, std::string &name) { 316b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar if (ConstantExpr *ce = dyn_cast<ConstantExpr>(c)) { 317b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar Constant *op = ce->getOperand(0); 318b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar if (GlobalVariable *gvn = dyn_cast<GlobalVariable>(op)) { 319b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar Constant *cn = gvn->getInitializer(); 32018c7f80b3e83ab584bd8572695a3cde8bafd9d3cChris Lattner if (ConstantDataArray *ca = dyn_cast<ConstantDataArray>(cn)) { 321b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar if (ca->isCString()) { 32218c7f80b3e83ab584bd8572695a3cde8bafd9d3cChris Lattner name = ".objc_class_name_" + ca->getAsCString().str(); 323b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar return true; 3243eb445feb22647e867a339f4c59b0a716b03a21aNick Kledzik } 325b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar } 3263eb445feb22647e867a339f4c59b0a716b03a21aNick Kledzik } 327b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar } 328b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar return false; 3293eb445feb22647e867a339f4c59b0a716b03a21aNick Kledzik} 3303eb445feb22647e867a339f4c59b0a716b03a21aNick Kledzik 33162cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// addObjCClass - Parse i386/ppc ObjC class data structure. 332b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbarvoid LTOModule::addObjCClass(GlobalVariable *clgv) { 333931d4c204390752b30d4459264f8786de95b36d8Bill Wendling ConstantStruct *c = dyn_cast<ConstantStruct>(clgv->getInitializer()); 334931d4c204390752b30d4459264f8786de95b36d8Bill Wendling if (!c) return; 335931d4c204390752b30d4459264f8786de95b36d8Bill Wendling 336931d4c204390752b30d4459264f8786de95b36d8Bill Wendling // second slot in __OBJC,__class is pointer to superclass name 337931d4c204390752b30d4459264f8786de95b36d8Bill Wendling std::string superclassName; 338931d4c204390752b30d4459264f8786de95b36d8Bill Wendling if (objcClassNameFromExpression(c->getOperand(1), superclassName)) { 339931d4c204390752b30d4459264f8786de95b36d8Bill Wendling NameAndAttributes info; 340931d4c204390752b30d4459264f8786de95b36d8Bill Wendling StringMap<NameAndAttributes>::value_type &entry = 341931d4c204390752b30d4459264f8786de95b36d8Bill Wendling _undefines.GetOrCreateValue(superclassName); 342931d4c204390752b30d4459264f8786de95b36d8Bill Wendling if (!entry.getValue().name) { 343931d4c204390752b30d4459264f8786de95b36d8Bill Wendling const char *symbolName = entry.getKey().data(); 344931d4c204390752b30d4459264f8786de95b36d8Bill Wendling info.name = symbolName; 345931d4c204390752b30d4459264f8786de95b36d8Bill Wendling info.attributes = LTO_SYMBOL_DEFINITION_UNDEFINED; 34624b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling info.isFunction = false; 34724b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling info.symbol = clgv; 348931d4c204390752b30d4459264f8786de95b36d8Bill Wendling entry.setValue(info); 3493eb445feb22647e867a339f4c59b0a716b03a21aNick Kledzik } 350b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar } 351931d4c204390752b30d4459264f8786de95b36d8Bill Wendling 352931d4c204390752b30d4459264f8786de95b36d8Bill Wendling // third slot in __OBJC,__class is pointer to class name 353931d4c204390752b30d4459264f8786de95b36d8Bill Wendling std::string className; 354931d4c204390752b30d4459264f8786de95b36d8Bill Wendling if (objcClassNameFromExpression(c->getOperand(2), className)) { 355931d4c204390752b30d4459264f8786de95b36d8Bill Wendling StringSet::value_type &entry = _defines.GetOrCreateValue(className); 356931d4c204390752b30d4459264f8786de95b36d8Bill Wendling entry.setValue(1); 35724b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling 358931d4c204390752b30d4459264f8786de95b36d8Bill Wendling NameAndAttributes info; 359931d4c204390752b30d4459264f8786de95b36d8Bill Wendling info.name = entry.getKey().data(); 36024b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling info.attributes = LTO_SYMBOL_PERMISSIONS_DATA | 36124b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling LTO_SYMBOL_DEFINITION_REGULAR | LTO_SYMBOL_SCOPE_DEFAULT; 36224b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling info.isFunction = false; 36324b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling info.symbol = clgv; 364931d4c204390752b30d4459264f8786de95b36d8Bill Wendling _symbols.push_back(info); 365931d4c204390752b30d4459264f8786de95b36d8Bill Wendling } 3663eb445feb22647e867a339f4c59b0a716b03a21aNick Kledzik} 3673eb445feb22647e867a339f4c59b0a716b03a21aNick Kledzik 36862cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// addObjCCategory - Parse i386/ppc ObjC category data structure. 369b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbarvoid LTOModule::addObjCCategory(GlobalVariable *clgv) { 370931d4c204390752b30d4459264f8786de95b36d8Bill Wendling ConstantStruct *c = dyn_cast<ConstantStruct>(clgv->getInitializer()); 371931d4c204390752b30d4459264f8786de95b36d8Bill Wendling if (!c) return; 372cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola 373931d4c204390752b30d4459264f8786de95b36d8Bill Wendling // second slot in __OBJC,__category is pointer to target class name 374931d4c204390752b30d4459264f8786de95b36d8Bill Wendling std::string targetclassName; 375931d4c204390752b30d4459264f8786de95b36d8Bill Wendling if (!objcClassNameFromExpression(c->getOperand(1), targetclassName)) 376931d4c204390752b30d4459264f8786de95b36d8Bill Wendling return; 377cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola 378931d4c204390752b30d4459264f8786de95b36d8Bill Wendling NameAndAttributes info; 379931d4c204390752b30d4459264f8786de95b36d8Bill Wendling StringMap<NameAndAttributes>::value_type &entry = 380931d4c204390752b30d4459264f8786de95b36d8Bill Wendling _undefines.GetOrCreateValue(targetclassName); 381cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola 382931d4c204390752b30d4459264f8786de95b36d8Bill Wendling if (entry.getValue().name) 383931d4c204390752b30d4459264f8786de95b36d8Bill Wendling return; 384931d4c204390752b30d4459264f8786de95b36d8Bill Wendling 385931d4c204390752b30d4459264f8786de95b36d8Bill Wendling const char *symbolName = entry.getKey().data(); 386931d4c204390752b30d4459264f8786de95b36d8Bill Wendling info.name = symbolName; 387931d4c204390752b30d4459264f8786de95b36d8Bill Wendling info.attributes = LTO_SYMBOL_DEFINITION_UNDEFINED; 38824b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling info.isFunction = false; 38924b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling info.symbol = clgv; 390931d4c204390752b30d4459264f8786de95b36d8Bill Wendling entry.setValue(info); 3913eb445feb22647e867a339f4c59b0a716b03a21aNick Kledzik} 3923eb445feb22647e867a339f4c59b0a716b03a21aNick Kledzik 39362cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// addObjCClassRef - Parse i386/ppc ObjC class list data structure. 394b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbarvoid LTOModule::addObjCClassRef(GlobalVariable *clgv) { 395b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar std::string targetclassName; 396931d4c204390752b30d4459264f8786de95b36d8Bill Wendling if (!objcClassNameFromExpression(clgv->getInitializer(), targetclassName)) 397931d4c204390752b30d4459264f8786de95b36d8Bill Wendling return; 398cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola 399931d4c204390752b30d4459264f8786de95b36d8Bill Wendling NameAndAttributes info; 400931d4c204390752b30d4459264f8786de95b36d8Bill Wendling StringMap<NameAndAttributes>::value_type &entry = 401931d4c204390752b30d4459264f8786de95b36d8Bill Wendling _undefines.GetOrCreateValue(targetclassName); 402931d4c204390752b30d4459264f8786de95b36d8Bill Wendling if (entry.getValue().name) 403931d4c204390752b30d4459264f8786de95b36d8Bill Wendling return; 404cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola 405931d4c204390752b30d4459264f8786de95b36d8Bill Wendling const char *symbolName = entry.getKey().data(); 406931d4c204390752b30d4459264f8786de95b36d8Bill Wendling info.name = symbolName; 407931d4c204390752b30d4459264f8786de95b36d8Bill Wendling info.attributes = LTO_SYMBOL_DEFINITION_UNDEFINED; 40824b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling info.isFunction = false; 40924b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling info.symbol = clgv; 410931d4c204390752b30d4459264f8786de95b36d8Bill Wendling entry.setValue(info); 41177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 41277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 41362cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// addDefinedDataSymbol - Add a data symbol as defined to the list. 414a7280fd61933f1268f69045cfbea46edb739726dBill Wendlingvoid LTOModule::addDefinedDataSymbol(GlobalValue *v) { 415b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // Add to list of defined symbols. 416a7280fd61933f1268f69045cfbea46edb739726dBill Wendling addDefinedSymbol(v, false); 417b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar 418eda3fc673450552808edfbf076d6bf26798acc64Bill Wendling if (!v->hasSection() /* || !isTargetDarwin */) 419eda3fc673450552808edfbf076d6bf26798acc64Bill Wendling return; 420eda3fc673450552808edfbf076d6bf26798acc64Bill Wendling 421b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // Special case i386/ppc ObjC data structures in magic sections: 422b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // The issue is that the old ObjC object format did some strange 423b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // contortions to avoid real linker symbols. For instance, the 424b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // ObjC class data structure is allocated statically in the executable 425b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // that defines that class. That data structures contains a pointer to 426b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // its superclass. But instead of just initializing that part of the 427b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // struct to the address of its superclass, and letting the static and 428b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // dynamic linkers do the rest, the runtime works by having that field 429b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // instead point to a C-string that is the name of the superclass. 430b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // At runtime the objc initialization updates that pointer and sets 431b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // it to point to the actual super class. As far as the linker 432b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // knows it is just a pointer to a string. But then someone wanted the 433b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // linker to issue errors at build time if the superclass was not found. 434b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // So they figured out a way in mach-o object format to use an absolute 435b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // symbols (.objc_class_name_Foo = 0) and a floating reference 436b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // (.reference .objc_class_name_Bar) to cause the linker into erroring when 437b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // a class was missing. 438b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // The following synthesizes the implicit .objc_* symbols for the linker 439b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // from the ObjC data structures generated by the front end. 440eda3fc673450552808edfbf076d6bf26798acc64Bill Wendling 441eda3fc673450552808edfbf076d6bf26798acc64Bill Wendling // special case if this data blob is an ObjC class definition 442eda3fc673450552808edfbf076d6bf26798acc64Bill Wendling if (v->getSection().compare(0, 15, "__OBJC,__class,") == 0) { 443eda3fc673450552808edfbf076d6bf26798acc64Bill Wendling if (GlobalVariable *gv = dyn_cast<GlobalVariable>(v)) { 444eda3fc673450552808edfbf076d6bf26798acc64Bill Wendling addObjCClass(gv); 44577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik } 446eda3fc673450552808edfbf076d6bf26798acc64Bill Wendling } 447b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar 448eda3fc673450552808edfbf076d6bf26798acc64Bill Wendling // special case if this data blob is an ObjC category definition 449eda3fc673450552808edfbf076d6bf26798acc64Bill Wendling else if (v->getSection().compare(0, 18, "__OBJC,__category,") == 0) { 450eda3fc673450552808edfbf076d6bf26798acc64Bill Wendling if (GlobalVariable *gv = dyn_cast<GlobalVariable>(v)) { 451eda3fc673450552808edfbf076d6bf26798acc64Bill Wendling addObjCCategory(gv); 4526a6f2dda36f2cff5cc97a2ffe0307da7b330a8b0Dale Johannesen } 453eda3fc673450552808edfbf076d6bf26798acc64Bill Wendling } 454b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar 455eda3fc673450552808edfbf076d6bf26798acc64Bill Wendling // special case if this data blob is the list of referenced classes 456eda3fc673450552808edfbf076d6bf26798acc64Bill Wendling else if (v->getSection().compare(0, 18, "__OBJC,__cls_refs,") == 0) { 457eda3fc673450552808edfbf076d6bf26798acc64Bill Wendling if (GlobalVariable *gv = dyn_cast<GlobalVariable>(v)) { 458eda3fc673450552808edfbf076d6bf26798acc64Bill Wendling addObjCClassRef(gv); 45977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik } 460b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar } 46177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 46277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 46362cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// addDefinedFunctionSymbol - Add a function symbol as defined to the list. 46462cf01e4c5de703e7712c72d12f577153b373cbaBill Wendlingvoid LTOModule::addDefinedFunctionSymbol(Function *f) { 46562cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling // add to list of defined symbols 46662cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling addDefinedSymbol(f, true); 46762cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling} 46862cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling 46962cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// addDefinedSymbol - Add a defined symbol to the list. 470a7280fd61933f1268f69045cfbea46edb739726dBill Wendlingvoid LTOModule::addDefinedSymbol(GlobalValue *def, bool isFunction) { 471b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // ignore all llvm.* symbols 472b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar if (def->getName().startswith("llvm.")) 473b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar return; 474b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar 475b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // string is owned by _defines 476ef1860a117b4a35918eb9793a7b94715e12a3a42Rafael Espindola SmallString<64> Buffer; 477a7280fd61933f1268f69045cfbea46edb739726dBill Wendling _mangler.getNameWithPrefix(Buffer, def, false); 478b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar 479b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // set alignment part log2() can have rounding errors 480b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar uint32_t align = def->getAlignment(); 481b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar uint32_t attr = align ? CountTrailingZeros_32(def->getAlignment()) : 0; 482b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar 483b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // set permissions part 48424b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling if (isFunction) { 485b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar attr |= LTO_SYMBOL_PERMISSIONS_CODE; 48624b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling } else { 487b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar GlobalVariable *gv = dyn_cast<GlobalVariable>(def); 488b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar if (gv && gv->isConstant()) 489b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar attr |= LTO_SYMBOL_PERMISSIONS_RODATA; 490b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar else 491b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar attr |= LTO_SYMBOL_PERMISSIONS_DATA; 492b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar } 493b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar 494b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // set definition part 495563ef5ec911d219b54fdb508518abd02a8dd3cfdBill Wendling if (def->hasWeakLinkage() || def->hasLinkOnceLinkage() || 49632811bef956e0fae4329e6515420d85f7e510660Bill Wendling def->hasLinkerPrivateWeakLinkage()) 497b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar attr |= LTO_SYMBOL_DEFINITION_WEAK; 4987afea0cfc4abebaf4cadcc37acd30fb251a5faf3Bill Wendling else if (def->hasCommonLinkage()) 499b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar attr |= LTO_SYMBOL_DEFINITION_TENTATIVE; 5007afea0cfc4abebaf4cadcc37acd30fb251a5faf3Bill Wendling else 501b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar attr |= LTO_SYMBOL_DEFINITION_REGULAR; 502b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar 503b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // set scope part 504b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar if (def->hasHiddenVisibility()) 505b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar attr |= LTO_SYMBOL_SCOPE_HIDDEN; 506b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar else if (def->hasProtectedVisibility()) 507b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar attr |= LTO_SYMBOL_SCOPE_PROTECTED; 5087afea0cfc4abebaf4cadcc37acd30fb251a5faf3Bill Wendling else if (def->hasExternalLinkage() || def->hasWeakLinkage() || 5097afea0cfc4abebaf4cadcc37acd30fb251a5faf3Bill Wendling def->hasLinkOnceLinkage() || def->hasCommonLinkage() || 5107afea0cfc4abebaf4cadcc37acd30fb251a5faf3Bill Wendling def->hasLinkerPrivateWeakLinkage()) 5113eb445feb22647e867a339f4c59b0a716b03a21aNick Kledzik attr |= LTO_SYMBOL_SCOPE_DEFAULT; 51232811bef956e0fae4329e6515420d85f7e510660Bill Wendling else if (def->hasLinkOnceODRAutoHideLinkage()) 5137afea0cfc4abebaf4cadcc37acd30fb251a5faf3Bill Wendling attr |= LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN; 514b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar else 515b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar attr |= LTO_SYMBOL_SCOPE_INTERNAL; 516b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar 517bd35f27ce9ecf7a6e6e1028dfc8652023cab265bChad Rosier StringSet::value_type &entry = _defines.GetOrCreateValue(Buffer); 518cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola entry.setValue(1); 519cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola 52024b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling // fill information structure 52124b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling NameAndAttributes info; 522cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola StringRef Name = entry.getKey(); 523cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola info.name = Name.data(); 524cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola assert(info.name[Name.size()] == '\0'); 52524b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling info.attributes = attr; 52624b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling info.isFunction = isFunction; 52724b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling info.symbol = def; 52824b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling 52924b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling // add to table of symbols 530b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar _symbols.push_back(info); 531c2aec57c63a8551cef27025dc7f0d2d9e56db013Devang Patel} 53277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 53362cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// addAsmGlobalSymbol - Add a global symbol from module-level ASM to the 53462cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// defined list. 53538c4e535493363b96eac47af9e7c056530137beaRafael Espindolavoid LTOModule::addAsmGlobalSymbol(const char *name, 53638c4e535493363b96eac47af9e7c056530137beaRafael Espindola lto_symbol_attributes scope) { 537cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola StringSet::value_type &entry = _defines.GetOrCreateValue(name); 538cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola 539b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // only add new define if not already defined 540cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola if (entry.getValue()) 541b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar return; 542b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar 543cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola entry.setValue(1); 54424b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling 54524b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling NameAndAttributes &info = _undefines[entry.getKey().data()]; 54624b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling 5471fcbca05db736afc3e555aadc14ae3a5bef59198Bill Wendling if (info.symbol == 0) { 5488ba9405c5ca9d95a61c5d575f16506ddac5d67d3Bill Wendling // FIXME: This is trying to take care of module ASM like this: 5498ba9405c5ca9d95a61c5d575f16506ddac5d67d3Bill Wendling // 5508ba9405c5ca9d95a61c5d575f16506ddac5d67d3Bill Wendling // module asm ".zerofill __FOO, __foo, _bar_baz_qux, 0" 5518ba9405c5ca9d95a61c5d575f16506ddac5d67d3Bill Wendling // 5528ba9405c5ca9d95a61c5d575f16506ddac5d67d3Bill Wendling // but is gross and its mother dresses it funny. Have the ASM parser give us 5538ba9405c5ca9d95a61c5d575f16506ddac5d67d3Bill Wendling // more details for this type of situation so that we're not guessing so 5548ba9405c5ca9d95a61c5d575f16506ddac5d67d3Bill Wendling // much. 5558ba9405c5ca9d95a61c5d575f16506ddac5d67d3Bill Wendling 5568ba9405c5ca9d95a61c5d575f16506ddac5d67d3Bill Wendling // fill information structure 557383fd7afd9cd2431fdb0b32130fc8125903a7fa8Rafael Espindola info.name = entry.getKey().data(); 5588ba9405c5ca9d95a61c5d575f16506ddac5d67d3Bill Wendling info.attributes = 5598ba9405c5ca9d95a61c5d575f16506ddac5d67d3Bill Wendling LTO_SYMBOL_PERMISSIONS_DATA | LTO_SYMBOL_DEFINITION_REGULAR | scope; 5608ba9405c5ca9d95a61c5d575f16506ddac5d67d3Bill Wendling info.isFunction = false; 5618ba9405c5ca9d95a61c5d575f16506ddac5d67d3Bill Wendling info.symbol = 0; 5628ba9405c5ca9d95a61c5d575f16506ddac5d67d3Bill Wendling 5638ba9405c5ca9d95a61c5d575f16506ddac5d67d3Bill Wendling // add to table of symbols 5648ba9405c5ca9d95a61c5d575f16506ddac5d67d3Bill Wendling _symbols.push_back(info); 5651fcbca05db736afc3e555aadc14ae3a5bef59198Bill Wendling return; 5661fcbca05db736afc3e555aadc14ae3a5bef59198Bill Wendling } 5671fcbca05db736afc3e555aadc14ae3a5bef59198Bill Wendling 56824b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling if (info.isFunction) 56924b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling addDefinedFunctionSymbol(cast<Function>(info.symbol)); 57024b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling else 57124b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling addDefinedDataSymbol(info.symbol); 5725ff4bc20a131cdf6fd0706b7abd80e16efc2f0e7Bill Wendling 5735ff4bc20a131cdf6fd0706b7abd80e16efc2f0e7Bill Wendling _symbols.back().attributes &= ~LTO_SYMBOL_SCOPE_MASK; 5745ff4bc20a131cdf6fd0706b7abd80e16efc2f0e7Bill Wendling _symbols.back().attributes |= scope; 575b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar} 5763eb445feb22647e867a339f4c59b0a716b03a21aNick Kledzik 57762cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// addAsmGlobalSymbolUndef - Add a global symbol from module-level ASM to the 57862cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// undefined list. 57938c4e535493363b96eac47af9e7c056530137beaRafael Espindolavoid LTOModule::addAsmGlobalSymbolUndef(const char *name) { 58038c4e535493363b96eac47af9e7c056530137beaRafael Espindola StringMap<NameAndAttributes>::value_type &entry = 58138c4e535493363b96eac47af9e7c056530137beaRafael Espindola _undefines.GetOrCreateValue(name); 58238c4e535493363b96eac47af9e7c056530137beaRafael Espindola 58338c4e535493363b96eac47af9e7c056530137beaRafael Espindola _asm_undefines.push_back(entry.getKey().data()); 58438c4e535493363b96eac47af9e7c056530137beaRafael Espindola 58538c4e535493363b96eac47af9e7c056530137beaRafael Espindola // we already have the symbol 58638c4e535493363b96eac47af9e7c056530137beaRafael Espindola if (entry.getValue().name) 58738c4e535493363b96eac47af9e7c056530137beaRafael Espindola return; 58838c4e535493363b96eac47af9e7c056530137beaRafael Espindola 58938c4e535493363b96eac47af9e7c056530137beaRafael Espindola uint32_t attr = LTO_SYMBOL_DEFINITION_UNDEFINED;; 59038c4e535493363b96eac47af9e7c056530137beaRafael Espindola attr |= LTO_SYMBOL_SCOPE_DEFAULT; 59138c4e535493363b96eac47af9e7c056530137beaRafael Espindola NameAndAttributes info; 59238c4e535493363b96eac47af9e7c056530137beaRafael Espindola info.name = entry.getKey().data(); 59324b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling info.attributes = attr; 59424b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling info.isFunction = false; 59524b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling info.symbol = 0; 59638c4e535493363b96eac47af9e7c056530137beaRafael Espindola 59738c4e535493363b96eac47af9e7c056530137beaRafael Espindola entry.setValue(info); 59838c4e535493363b96eac47af9e7c056530137beaRafael Espindola} 59938c4e535493363b96eac47af9e7c056530137beaRafael Espindola 60062cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// addPotentialUndefinedSymbol - Add a symbol which isn't defined just yet to a 60162cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// list to be resolved later. 60224b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendlingvoid LTOModule::addPotentialUndefinedSymbol(GlobalValue *decl, bool isFunc) { 603b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // ignore all llvm.* symbols 604b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar if (decl->getName().startswith("llvm.")) 605b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar return; 606b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar 607b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // ignore all aliases 608b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar if (isa<GlobalAlias>(decl)) 609b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar return; 610b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar 611ef1860a117b4a35918eb9793a7b94715e12a3a42Rafael Espindola SmallString<64> name; 612a7280fd61933f1268f69045cfbea46edb739726dBill Wendling _mangler.getNameWithPrefix(name, decl, false); 613b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar 614cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola StringMap<NameAndAttributes>::value_type &entry = 615bd35f27ce9ecf7a6e6e1028dfc8652023cab265bChad Rosier _undefines.GetOrCreateValue(name); 616cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola 617b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar // we already have the symbol 618cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola if (entry.getValue().name) 619b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar return; 620b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar 621b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar NameAndAttributes info; 622cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola 623cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola info.name = entry.getKey().data(); 62462cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling 625b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar if (decl->hasExternalWeakLinkage()) 626b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar info.attributes = LTO_SYMBOL_DEFINITION_WEAKUNDEF; 627b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar else 628b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar info.attributes = LTO_SYMBOL_DEFINITION_UNDEFINED; 629cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola 63024b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling info.isFunction = isFunc; 63124b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling info.symbol = decl; 63224b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling 633cd6c93ec48937ab4f76dfd3bf5dc7e68ed781508Rafael Espindola entry.setValue(info); 634b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar} 635485ded0db71b2abe51da919bd58501cee345c443Nick Lewycky 63638c4e535493363b96eac47af9e7c056530137beaRafael Espindolanamespace { 63738c4e535493363b96eac47af9e7c056530137beaRafael Espindola class RecordStreamer : public MCStreamer { 63838c4e535493363b96eac47af9e7c056530137beaRafael Espindola public: 63990e7d4f6f006672a59ff8e031a190c76f9dab4b3Bill Wendling enum State { NeverSeen, Global, Defined, DefinedGlobal, Used }; 64038c4e535493363b96eac47af9e7c056530137beaRafael Espindola 64138c4e535493363b96eac47af9e7c056530137beaRafael Espindola private: 64238c4e535493363b96eac47af9e7c056530137beaRafael Espindola StringMap<State> Symbols; 64338c4e535493363b96eac47af9e7c056530137beaRafael Espindola 64438c4e535493363b96eac47af9e7c056530137beaRafael Espindola void markDefined(const MCSymbol &Symbol) { 64538c4e535493363b96eac47af9e7c056530137beaRafael Espindola State &S = Symbols[Symbol.getName()]; 64638c4e535493363b96eac47af9e7c056530137beaRafael Espindola switch (S) { 64738c4e535493363b96eac47af9e7c056530137beaRafael Espindola case DefinedGlobal: 64838c4e535493363b96eac47af9e7c056530137beaRafael Espindola case Global: 64938c4e535493363b96eac47af9e7c056530137beaRafael Espindola S = DefinedGlobal; 65038c4e535493363b96eac47af9e7c056530137beaRafael Espindola break; 65138c4e535493363b96eac47af9e7c056530137beaRafael Espindola case NeverSeen: 65238c4e535493363b96eac47af9e7c056530137beaRafael Espindola case Defined: 65338c4e535493363b96eac47af9e7c056530137beaRafael Espindola case Used: 65438c4e535493363b96eac47af9e7c056530137beaRafael Espindola S = Defined; 65538c4e535493363b96eac47af9e7c056530137beaRafael Espindola break; 65638c4e535493363b96eac47af9e7c056530137beaRafael Espindola } 65738c4e535493363b96eac47af9e7c056530137beaRafael Espindola } 65838c4e535493363b96eac47af9e7c056530137beaRafael Espindola void markGlobal(const MCSymbol &Symbol) { 65938c4e535493363b96eac47af9e7c056530137beaRafael Espindola State &S = Symbols[Symbol.getName()]; 66038c4e535493363b96eac47af9e7c056530137beaRafael Espindola switch (S) { 66138c4e535493363b96eac47af9e7c056530137beaRafael Espindola case DefinedGlobal: 66238c4e535493363b96eac47af9e7c056530137beaRafael Espindola case Defined: 66338c4e535493363b96eac47af9e7c056530137beaRafael Espindola S = DefinedGlobal; 66438c4e535493363b96eac47af9e7c056530137beaRafael Espindola break; 66538c4e535493363b96eac47af9e7c056530137beaRafael Espindola 66638c4e535493363b96eac47af9e7c056530137beaRafael Espindola case NeverSeen: 66738c4e535493363b96eac47af9e7c056530137beaRafael Espindola case Global: 66838c4e535493363b96eac47af9e7c056530137beaRafael Espindola case Used: 66938c4e535493363b96eac47af9e7c056530137beaRafael Espindola S = Global; 67038c4e535493363b96eac47af9e7c056530137beaRafael Espindola break; 67138c4e535493363b96eac47af9e7c056530137beaRafael Espindola } 67238c4e535493363b96eac47af9e7c056530137beaRafael Espindola } 67338c4e535493363b96eac47af9e7c056530137beaRafael Espindola void markUsed(const MCSymbol &Symbol) { 67438c4e535493363b96eac47af9e7c056530137beaRafael Espindola State &S = Symbols[Symbol.getName()]; 67538c4e535493363b96eac47af9e7c056530137beaRafael Espindola switch (S) { 67638c4e535493363b96eac47af9e7c056530137beaRafael Espindola case DefinedGlobal: 67738c4e535493363b96eac47af9e7c056530137beaRafael Espindola case Defined: 67838c4e535493363b96eac47af9e7c056530137beaRafael Espindola case Global: 67938c4e535493363b96eac47af9e7c056530137beaRafael Espindola break; 68038c4e535493363b96eac47af9e7c056530137beaRafael Espindola 68138c4e535493363b96eac47af9e7c056530137beaRafael Espindola case NeverSeen: 68238c4e535493363b96eac47af9e7c056530137beaRafael Espindola case Used: 68338c4e535493363b96eac47af9e7c056530137beaRafael Espindola S = Used; 68438c4e535493363b96eac47af9e7c056530137beaRafael Espindola break; 68538c4e535493363b96eac47af9e7c056530137beaRafael Espindola } 68638c4e535493363b96eac47af9e7c056530137beaRafael Espindola } 68738c4e535493363b96eac47af9e7c056530137beaRafael Espindola 68838c4e535493363b96eac47af9e7c056530137beaRafael Espindola // FIXME: mostly copied for the obj streamer. 68938c4e535493363b96eac47af9e7c056530137beaRafael Espindola void AddValueSymbols(const MCExpr *Value) { 69038c4e535493363b96eac47af9e7c056530137beaRafael Espindola switch (Value->getKind()) { 69138c4e535493363b96eac47af9e7c056530137beaRafael Espindola case MCExpr::Target: 69238c4e535493363b96eac47af9e7c056530137beaRafael Espindola // FIXME: What should we do in here? 69338c4e535493363b96eac47af9e7c056530137beaRafael Espindola break; 69438c4e535493363b96eac47af9e7c056530137beaRafael Espindola 69538c4e535493363b96eac47af9e7c056530137beaRafael Espindola case MCExpr::Constant: 69638c4e535493363b96eac47af9e7c056530137beaRafael Espindola break; 69738c4e535493363b96eac47af9e7c056530137beaRafael Espindola 69838c4e535493363b96eac47af9e7c056530137beaRafael Espindola case MCExpr::Binary: { 69938c4e535493363b96eac47af9e7c056530137beaRafael Espindola const MCBinaryExpr *BE = cast<MCBinaryExpr>(Value); 70038c4e535493363b96eac47af9e7c056530137beaRafael Espindola AddValueSymbols(BE->getLHS()); 70138c4e535493363b96eac47af9e7c056530137beaRafael Espindola AddValueSymbols(BE->getRHS()); 70238c4e535493363b96eac47af9e7c056530137beaRafael Espindola break; 70338c4e535493363b96eac47af9e7c056530137beaRafael Espindola } 70438c4e535493363b96eac47af9e7c056530137beaRafael Espindola 70538c4e535493363b96eac47af9e7c056530137beaRafael Espindola case MCExpr::SymbolRef: 70638c4e535493363b96eac47af9e7c056530137beaRafael Espindola markUsed(cast<MCSymbolRefExpr>(Value)->getSymbol()); 70738c4e535493363b96eac47af9e7c056530137beaRafael Espindola break; 70838c4e535493363b96eac47af9e7c056530137beaRafael Espindola 70938c4e535493363b96eac47af9e7c056530137beaRafael Espindola case MCExpr::Unary: 71038c4e535493363b96eac47af9e7c056530137beaRafael Espindola AddValueSymbols(cast<MCUnaryExpr>(Value)->getSubExpr()); 71138c4e535493363b96eac47af9e7c056530137beaRafael Espindola break; 71238c4e535493363b96eac47af9e7c056530137beaRafael Espindola } 71338c4e535493363b96eac47af9e7c056530137beaRafael Espindola } 71438c4e535493363b96eac47af9e7c056530137beaRafael Espindola 71538c4e535493363b96eac47af9e7c056530137beaRafael Espindola public: 71638c4e535493363b96eac47af9e7c056530137beaRafael Espindola typedef StringMap<State>::const_iterator const_iterator; 71738c4e535493363b96eac47af9e7c056530137beaRafael Espindola 71838c4e535493363b96eac47af9e7c056530137beaRafael Espindola const_iterator begin() { 71938c4e535493363b96eac47af9e7c056530137beaRafael Espindola return Symbols.begin(); 72038c4e535493363b96eac47af9e7c056530137beaRafael Espindola } 72138c4e535493363b96eac47af9e7c056530137beaRafael Espindola 72238c4e535493363b96eac47af9e7c056530137beaRafael Espindola const_iterator end() { 72338c4e535493363b96eac47af9e7c056530137beaRafael Espindola return Symbols.end(); 72438c4e535493363b96eac47af9e7c056530137beaRafael Espindola } 7254136e7b90ea5ce8b4d708cdd54d0b052d520a96eGabor Greif 72638c4e535493363b96eac47af9e7c056530137beaRafael Espindola RecordStreamer(MCContext &Context) : MCStreamer(Context) {} 72777595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 72890e7d4f6f006672a59ff8e031a190c76f9dab4b3Bill Wendling virtual void EmitInstruction(const MCInst &Inst) { 72990e7d4f6f006672a59ff8e031a190c76f9dab4b3Bill Wendling // Scan for values. 73090e7d4f6f006672a59ff8e031a190c76f9dab4b3Bill Wendling for (unsigned i = Inst.getNumOperands(); i--; ) 73190e7d4f6f006672a59ff8e031a190c76f9dab4b3Bill Wendling if (Inst.getOperand(i).isExpr()) 73290e7d4f6f006672a59ff8e031a190c76f9dab4b3Bill Wendling AddValueSymbols(Inst.getOperand(i).getExpr()); 73390e7d4f6f006672a59ff8e031a190c76f9dab4b3Bill Wendling } 73438c4e535493363b96eac47af9e7c056530137beaRafael Espindola virtual void EmitLabel(MCSymbol *Symbol) { 73538c4e535493363b96eac47af9e7c056530137beaRafael Espindola Symbol->setSection(*getCurrentSection()); 73638c4e535493363b96eac47af9e7c056530137beaRafael Espindola markDefined(*Symbol); 73738c4e535493363b96eac47af9e7c056530137beaRafael Espindola } 73838c4e535493363b96eac47af9e7c056530137beaRafael Espindola virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) { 73938c4e535493363b96eac47af9e7c056530137beaRafael Espindola // FIXME: should we handle aliases? 74038c4e535493363b96eac47af9e7c056530137beaRafael Espindola markDefined(*Symbol); 74138c4e535493363b96eac47af9e7c056530137beaRafael Espindola } 74238c4e535493363b96eac47af9e7c056530137beaRafael Espindola virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) { 74338c4e535493363b96eac47af9e7c056530137beaRafael Espindola if (Attribute == MCSA_Global) 74438c4e535493363b96eac47af9e7c056530137beaRafael Espindola markGlobal(*Symbol); 74538c4e535493363b96eac47af9e7c056530137beaRafael Espindola } 74638c4e535493363b96eac47af9e7c056530137beaRafael Espindola virtual void EmitZerofill(const MCSection *Section, MCSymbol *Symbol, 747df42d41cd64b35e359364ea9804d71f30864d45dEvan Cheng uint64_t Size , unsigned ByteAlignment) { 74838c4e535493363b96eac47af9e7c056530137beaRafael Espindola markDefined(*Symbol); 74938c4e535493363b96eac47af9e7c056530137beaRafael Espindola } 75038c4e535493363b96eac47af9e7c056530137beaRafael Espindola virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, 75138c4e535493363b96eac47af9e7c056530137beaRafael Espindola unsigned ByteAlignment) { 75238c4e535493363b96eac47af9e7c056530137beaRafael Espindola markDefined(*Symbol); 75338c4e535493363b96eac47af9e7c056530137beaRafael Espindola } 75490e7d4f6f006672a59ff8e031a190c76f9dab4b3Bill Wendling 75590e7d4f6f006672a59ff8e031a190c76f9dab4b3Bill Wendling // Noop calls. 75690e7d4f6f006672a59ff8e031a190c76f9dab4b3Bill Wendling virtual void ChangeSection(const MCSection *Section) {} 75790e7d4f6f006672a59ff8e031a190c76f9dab4b3Bill Wendling virtual void InitSections() {} 75890e7d4f6f006672a59ff8e031a190c76f9dab4b3Bill Wendling virtual void EmitAssemblerFlag(MCAssemblerFlag Flag) {} 75990e7d4f6f006672a59ff8e031a190c76f9dab4b3Bill Wendling virtual void EmitThumbFunc(MCSymbol *Func) {} 76090e7d4f6f006672a59ff8e031a190c76f9dab4b3Bill Wendling virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {} 76190e7d4f6f006672a59ff8e031a190c76f9dab4b3Bill Wendling virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) {} 76290e7d4f6f006672a59ff8e031a190c76f9dab4b3Bill Wendling virtual void BeginCOFFSymbolDef(const MCSymbol *Symbol) {} 76390e7d4f6f006672a59ff8e031a190c76f9dab4b3Bill Wendling virtual void EmitCOFFSymbolStorageClass(int StorageClass) {} 76490e7d4f6f006672a59ff8e031a190c76f9dab4b3Bill Wendling virtual void EmitCOFFSymbolType(int Type) {} 76590e7d4f6f006672a59ff8e031a190c76f9dab4b3Bill Wendling virtual void EndCOFFSymbolDef() {} 76638c4e535493363b96eac47af9e7c056530137beaRafael Espindola virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) {} 76736a16015ac108e2f0dd2d6d96a6d364bc74c50d7Benjamin Kramer virtual void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, 76836a16015ac108e2f0dd2d6d96a6d364bc74c50d7Benjamin Kramer unsigned ByteAlignment) {} 76938c4e535493363b96eac47af9e7c056530137beaRafael Espindola virtual void EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol, 77038c4e535493363b96eac47af9e7c056530137beaRafael Espindola uint64_t Size, unsigned ByteAlignment) {} 77138c4e535493363b96eac47af9e7c056530137beaRafael Espindola virtual void EmitBytes(StringRef Data, unsigned AddrSpace) {} 77238c4e535493363b96eac47af9e7c056530137beaRafael Espindola virtual void EmitValueImpl(const MCExpr *Value, unsigned Size, 773debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola unsigned AddrSpace) {} 774e8cfbd843d737e1f95c3032c7670c2be3838a6f6Rafael Espindola virtual void EmitULEB128Value(const MCExpr *Value) {} 775e8cfbd843d737e1f95c3032c7670c2be3838a6f6Rafael Espindola virtual void EmitSLEB128Value(const MCExpr *Value) {} 77638c4e535493363b96eac47af9e7c056530137beaRafael Espindola virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value, 77738c4e535493363b96eac47af9e7c056530137beaRafael Espindola unsigned ValueSize, 77838c4e535493363b96eac47af9e7c056530137beaRafael Espindola unsigned MaxBytesToEmit) {} 77938c4e535493363b96eac47af9e7c056530137beaRafael Espindola virtual void EmitCodeAlignment(unsigned ByteAlignment, 78038c4e535493363b96eac47af9e7c056530137beaRafael Espindola unsigned MaxBytesToEmit) {} 781ebd4c05c3cbd61215366d4d16f1c1a2e57e7156dJim Grosbach virtual bool EmitValueToOffset(const MCExpr *Offset, 782ebd4c05c3cbd61215366d4d16f1c1a2e57e7156dJim Grosbach unsigned char Value ) { return false; } 78338c4e535493363b96eac47af9e7c056530137beaRafael Espindola virtual void EmitFileDirective(StringRef Filename) {} 78438c4e535493363b96eac47af9e7c056530137beaRafael Espindola virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta, 78538c4e535493363b96eac47af9e7c056530137beaRafael Espindola const MCSymbol *LastLabel, 786672b93a3324cc1da6d374eed4c75c050a9cad7beEvan Cheng const MCSymbol *Label, 787672b93a3324cc1da6d374eed4c75c050a9cad7beEvan Cheng unsigned PointerSize) {} 78899b4237c1647156f0e1d3d7e03efdab23ed79778Rafael Espindola virtual void FinishImpl() {} 78938c4e535493363b96eac47af9e7c056530137beaRafael Espindola }; 79024b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling} // end anonymous namespace 79138c4e535493363b96eac47af9e7c056530137beaRafael Espindola 79262cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// addAsmGlobalSymbols - Add global symbols from module-level ASM to the 79362cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// defined or undefined lists. 794b9bff969e96a24da18d6c5d0d623a7d790d41fa2Bill Wendlingbool LTOModule::addAsmGlobalSymbols(std::string &errMsg) { 79538c4e535493363b96eac47af9e7c056530137beaRafael Espindola const std::string &inlineAsm = _module->getModuleInlineAsm(); 7966d483c2b0712d0111b02d23cda7c65c0f43cf1f1Ivan Krasin if (inlineAsm.empty()) 7976d483c2b0712d0111b02d23cda7c65c0f43cf1f1Ivan Krasin return false; 79838c4e535493363b96eac47af9e7c056530137beaRafael Espindola 799b9bff969e96a24da18d6c5d0d623a7d790d41fa2Bill Wendling OwningPtr<RecordStreamer> Streamer(new RecordStreamer(_context)); 80038c4e535493363b96eac47af9e7c056530137beaRafael Espindola MemoryBuffer *Buffer = MemoryBuffer::getMemBuffer(inlineAsm); 80138c4e535493363b96eac47af9e7c056530137beaRafael Espindola SourceMgr SrcMgr; 80238c4e535493363b96eac47af9e7c056530137beaRafael Espindola SrcMgr.AddNewSourceBuffer(Buffer, SMLoc()); 8031b84cce77f8bccc905b4800927ce9016f76c1c40Jim Grosbach OwningPtr<MCAsmParser> Parser(createMCAsmParser(SrcMgr, 804b9bff969e96a24da18d6c5d0d623a7d790d41fa2Bill Wendling _context, *Streamer, 80538c4e535493363b96eac47af9e7c056530137beaRafael Espindola *_target->getMCAsmInfo())); 8065682527882aa3ddc74d0b283496fedd069a8e55dBill Wendling const Target &T = _target->getTarget(); 8075682527882aa3ddc74d0b283496fedd069a8e55dBill Wendling OwningPtr<MCSubtargetInfo> 8085682527882aa3ddc74d0b283496fedd069a8e55dBill Wendling STI(T.createMCSubtargetInfo(_target->getTargetTriple(), 8095682527882aa3ddc74d0b283496fedd069a8e55dBill Wendling _target->getTargetCPU(), 8105682527882aa3ddc74d0b283496fedd069a8e55dBill Wendling _target->getTargetFeatureString())); 8115682527882aa3ddc74d0b283496fedd069a8e55dBill Wendling OwningPtr<MCTargetAsmParser> TAP(T.createMCAsmParser(*STI, *Parser.get())); 812603e103988d98c0ea5d37e7cceaf5bbffe076f28Ivan Krasin if (!TAP) { 8135682527882aa3ddc74d0b283496fedd069a8e55dBill Wendling errMsg = "target " + std::string(T.getName()) + 8145682527882aa3ddc74d0b283496fedd069a8e55dBill Wendling " does not define AsmParser."; 815603e103988d98c0ea5d37e7cceaf5bbffe076f28Ivan Krasin return true; 816603e103988d98c0ea5d37e7cceaf5bbffe076f28Ivan Krasin } 817603e103988d98c0ea5d37e7cceaf5bbffe076f28Ivan Krasin 81838c4e535493363b96eac47af9e7c056530137beaRafael Espindola Parser->setTargetParser(*TAP); 8195682527882aa3ddc74d0b283496fedd069a8e55dBill Wendling if (Parser->Run(false)) 82038c4e535493363b96eac47af9e7c056530137beaRafael Espindola return true; 82138c4e535493363b96eac47af9e7c056530137beaRafael Espindola 82238c4e535493363b96eac47af9e7c056530137beaRafael Espindola for (RecordStreamer::const_iterator i = Streamer->begin(), 82338c4e535493363b96eac47af9e7c056530137beaRafael Espindola e = Streamer->end(); i != e; ++i) { 82438c4e535493363b96eac47af9e7c056530137beaRafael Espindola StringRef Key = i->first(); 82538c4e535493363b96eac47af9e7c056530137beaRafael Espindola RecordStreamer::State Value = i->second; 82638c4e535493363b96eac47af9e7c056530137beaRafael Espindola if (Value == RecordStreamer::DefinedGlobal) 82738c4e535493363b96eac47af9e7c056530137beaRafael Espindola addAsmGlobalSymbol(Key.data(), LTO_SYMBOL_SCOPE_DEFAULT); 82838c4e535493363b96eac47af9e7c056530137beaRafael Espindola else if (Value == RecordStreamer::Defined) 82938c4e535493363b96eac47af9e7c056530137beaRafael Espindola addAsmGlobalSymbol(Key.data(), LTO_SYMBOL_SCOPE_INTERNAL); 83038c4e535493363b96eac47af9e7c056530137beaRafael Espindola else if (Value == RecordStreamer::Global || 83138c4e535493363b96eac47af9e7c056530137beaRafael Espindola Value == RecordStreamer::Used) 83238c4e535493363b96eac47af9e7c056530137beaRafael Espindola addAsmGlobalSymbolUndef(Key.data()); 83338c4e535493363b96eac47af9e7c056530137beaRafael Espindola } 8345682527882aa3ddc74d0b283496fedd069a8e55dBill Wendling 83538c4e535493363b96eac47af9e7c056530137beaRafael Espindola return false; 83638c4e535493363b96eac47af9e7c056530137beaRafael Espindola} 83738c4e535493363b96eac47af9e7c056530137beaRafael Espindola 83862cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// isDeclaration - Return 'true' if the global value is a declaration. 839f19d7a7af3f10b6d43f9e8b0271f0f836a33d52cRafael Espindolastatic bool isDeclaration(const GlobalValue &V) { 840f19d7a7af3f10b6d43f9e8b0271f0f836a33d52cRafael Espindola if (V.hasAvailableExternallyLinkage()) 841f19d7a7af3f10b6d43f9e8b0271f0f836a33d52cRafael Espindola return true; 8425682527882aa3ddc74d0b283496fedd069a8e55dBill Wendling 843f19d7a7af3f10b6d43f9e8b0271f0f836a33d52cRafael Espindola if (V.isMaterializable()) 844f19d7a7af3f10b6d43f9e8b0271f0f836a33d52cRafael Espindola return false; 8455682527882aa3ddc74d0b283496fedd069a8e55dBill Wendling 846f19d7a7af3f10b6d43f9e8b0271f0f836a33d52cRafael Espindola return V.isDeclaration(); 847f19d7a7af3f10b6d43f9e8b0271f0f836a33d52cRafael Espindola} 848f19d7a7af3f10b6d43f9e8b0271f0f836a33d52cRafael Espindola 8493bb17380b1c87fa23ef9fe208ce6f56d352df611Bill Wendling/// parseSymbols - Parse the symbols from the module and model-level ASM and add 85062cf01e4c5de703e7712c72d12f577153b373cbaBill Wendling/// them to either the defined or undefined lists. 8513bb17380b1c87fa23ef9fe208ce6f56d352df611Bill Wendlingbool LTOModule::parseSymbols(std::string &errMsg) { 852e41d90094c9dbbabd6031957689f67ea504ed616Daniel Dunbar // add functions 8539f3b483b814efb536d1ad391e664443333d14179Bill Wendling for (Module::iterator f = _module->begin(), e = _module->end(); f != e; ++f) { 854f19d7a7af3f10b6d43f9e8b0271f0f836a33d52cRafael Espindola if (isDeclaration(*f)) 85524b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling addPotentialUndefinedSymbol(f, true); 856e41d90094c9dbbabd6031957689f67ea504ed616Daniel Dunbar else 857a7280fd61933f1268f69045cfbea46edb739726dBill Wendling addDefinedFunctionSymbol(f); 858e41d90094c9dbbabd6031957689f67ea504ed616Daniel Dunbar } 859e41d90094c9dbbabd6031957689f67ea504ed616Daniel Dunbar 860e41d90094c9dbbabd6031957689f67ea504ed616Daniel Dunbar // add data 861e41d90094c9dbbabd6031957689f67ea504ed616Daniel Dunbar for (Module::global_iterator v = _module->global_begin(), 862e41d90094c9dbbabd6031957689f67ea504ed616Daniel Dunbar e = _module->global_end(); v != e; ++v) { 863f19d7a7af3f10b6d43f9e8b0271f0f836a33d52cRafael Espindola if (isDeclaration(*v)) 86424b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling addPotentialUndefinedSymbol(v, false); 865e41d90094c9dbbabd6031957689f67ea504ed616Daniel Dunbar else 866a7280fd61933f1268f69045cfbea46edb739726dBill Wendling addDefinedDataSymbol(v); 867e41d90094c9dbbabd6031957689f67ea504ed616Daniel Dunbar } 868e41d90094c9dbbabd6031957689f67ea504ed616Daniel Dunbar 869e41d90094c9dbbabd6031957689f67ea504ed616Daniel Dunbar // add asm globals 870b9bff969e96a24da18d6c5d0d623a7d790d41fa2Bill Wendling if (addAsmGlobalSymbols(errMsg)) 87138c4e535493363b96eac47af9e7c056530137beaRafael Espindola return true; 872e41d90094c9dbbabd6031957689f67ea504ed616Daniel Dunbar 87302003caf2291ebb2d634e1938553e58e5dd0dce8Rafael Espindola // add aliases 87424b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling for (Module::alias_iterator a = _module->alias_begin(), 87524b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling e = _module->alias_end(); a != e; ++a) { 87624b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling if (isDeclaration(*a->getAliasedGlobal())) 87761476d6f90b772c0e6c725308199afe10743ce0eBill Wendling // Is an alias to a declaration. 87824b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling addPotentialUndefinedSymbol(a, false); 87902003caf2291ebb2d634e1938553e58e5dd0dce8Rafael Espindola else 88024b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling addDefinedDataSymbol(a); 88102003caf2291ebb2d634e1938553e58e5dd0dce8Rafael Espindola } 88202003caf2291ebb2d634e1938553e58e5dd0dce8Rafael Espindola 883e41d90094c9dbbabd6031957689f67ea504ed616Daniel Dunbar // make symbols for all undefines 88424b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling for (StringMap<NameAndAttributes>::iterator u =_undefines.begin(), 88524b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling e = _undefines.end(); u != e; ++u) { 88624b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling // If this symbol also has a definition, then don't make an undefine because 88724b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling // it is a tentative definition. 88824b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling if (_defines.count(u->getKey())) continue; 88924b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling NameAndAttributes info = u->getValue(); 89024b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling _symbols.push_back(info); 891b06913dd183fe4d294b88a166d4180d3de660135Daniel Dunbar } 89224b878031d4f62baf0e9a0573aeebc9dfd54b546Bill Wendling 89338c4e535493363b96eac47af9e7c056530137beaRafael Espindola return false; 894ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik} 895