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