From 08fb05c3ac440979021f508bfee073359be46f7e Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Wed, 25 Oct 2006 18:10:07 +0000 Subject: [PATCH] Supply alignment info to linker through LLVMSymbol. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31181 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/LinkTimeOptimizer.h | 6 ++++-- tools/lto/lto.cpp | 18 ++++++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/include/llvm/LinkTimeOptimizer.h b/include/llvm/LinkTimeOptimizer.h index b52c578efea..c126bb23620 100644 --- a/include/llvm/LinkTimeOptimizer.h +++ b/include/llvm/LinkTimeOptimizer.h @@ -57,17 +57,19 @@ namespace llvm { void mayBeNotUsed(); LLVMSymbol (enum LTOLinkageTypes lt, GlobalValue *g, const std::string &n, - const std::string &m) : linkage(lt), gv(g), name(n), - mangledName(m) {} + const std::string &m, int a) : linkage(lt), gv(g), name(n), + mangledName(m), alignment(a) {} const char *getName() { return name.c_str(); } const char *getMangledName() { return mangledName.c_str(); } + int getAlignment() { return alignment; } private: enum LTOLinkageTypes linkage; GlobalValue *gv; std::string name; std::string mangledName; + int alignment; }; class string_compare { diff --git a/tools/lto/lto.cpp b/tools/lto/lto.cpp index 5c507708b4a..b08b1a62dc3 100644 --- a/tools/lto/lto.cpp +++ b/tools/lto/lto.cpp @@ -36,6 +36,7 @@ #include "llvm/Transforms/IPO.h" #include "llvm/Transforms/Scalar.h" #include "llvm/Analysis/LoadValueNumbering.h" +#include "llvm/Support/MathExtras.h" #include "llvm/LinkTimeOptimizer.h" #include #include @@ -149,8 +150,7 @@ LTO::readLLVMObjectFile(const std::string &InputFilename, return LTO_READ_FAILURE; // Collect Target info - if (!Target) - getTarget(m); + getTarget(m); if (!Target) return LTO_READ_FAILURE; @@ -166,8 +166,10 @@ LTO::readLLVMObjectFile(const std::string &InputFilename, if (!f->isExternal() && lt != LTOInternalLinkage && strncmp (f->getName().c_str(), "llvm.", 5)) { + int alignment = ( 16 > f->getAlignment() ? 16 : f->getAlignment()); LLVMSymbol *newSymbol = new LLVMSymbol(lt, f, f->getName(), - mangler.getValueName(f)); + mangler.getValueName(f), + Log2_32(alignment)); symbols[newSymbol->getMangledName()] = newSymbol; allSymbols[newSymbol->getMangledName()] = newSymbol; } @@ -186,8 +188,10 @@ LTO::readLLVMObjectFile(const std::string &InputFilename, LTOLinkageTypes lt = getLTOLinkageType(v); if (!v->isExternal() && lt != LTOInternalLinkage && strncmp (v->getName().c_str(), "llvm.", 5)) { + const TargetData *TD = Target->getTargetData(); LLVMSymbol *newSymbol = new LLVMSymbol(lt, v, v->getName(), - mangler.getValueName(v)); + mangler.getValueName(v), + TD->getPreferredAlignmentLog(v)); symbols[newSymbol->getMangledName()] = newSymbol; allSymbols[newSymbol->getMangledName()] = newSymbol; @@ -206,6 +210,9 @@ LTO::readLLVMObjectFile(const std::string &InputFilename, void LTO::getTarget (Module *M) { + if (Target) + return; + std::string Err; const TargetMachineRegistry::Entry* March = TargetMachineRegistry::getClosestStaticTargetForModule(*M, Err); @@ -230,8 +237,7 @@ LTO::optimize(Module *M, std::ostream &Out, PassManager Passes; // Collect Target info - if (!Target) - getTarget(M); + getTarget(M); if (!Target) return LTO_NO_TARGET;