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 {
#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 <fstream>
#include <iostream>
return LTO_READ_FAILURE;
// Collect Target info
- if (!Target)
- getTarget(m);
+ getTarget(m);
if (!Target)
return LTO_READ_FAILURE;
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;
}
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;
void
LTO::getTarget (Module *M) {
+ if (Target)
+ return;
+
std::string Err;
const TargetMachineRegistry::Entry* March =
TargetMachineRegistry::getClosestStaticTargetForModule(*M, Err);
PassManager Passes;
// Collect Target info
- if (!Target)
- getTarget(M);
+ getTarget(M);
if (!Target)
return LTO_NO_TARGET;