diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2013-04-08 18:41:23 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2013-04-08 18:41:23 +0000 | 
| commit | 4a16efa3e43e35f0cc9efe3a67f620f0017c3d36 (patch) | |
| tree | 06099edc18d30894081a822b756f117cbe0b8207 /lib/Target/CppBackend/CPPBackend.cpp | |
| parent | 482e7bddf617ae804dc47133cb07eb4aa81e45de (diff) | |
Notes
Diffstat (limited to 'lib/Target/CppBackend/CPPBackend.cpp')
| -rw-r--r-- | lib/Target/CppBackend/CPPBackend.cpp | 111 | 
1 files changed, 57 insertions, 54 deletions
diff --git a/lib/Target/CppBackend/CPPBackend.cpp b/lib/Target/CppBackend/CPPBackend.cpp index 5c909903f94bf..3e69098edcc37 100644 --- a/lib/Target/CppBackend/CPPBackend.cpp +++ b/lib/Target/CppBackend/CPPBackend.cpp @@ -13,25 +13,25 @@  //===----------------------------------------------------------------------===//  #include "CPPTargetMachine.h" -#include "llvm/CallingConv.h" -#include "llvm/Constants.h" -#include "llvm/DerivedTypes.h" -#include "llvm/InlineAsm.h" -#include "llvm/Instruction.h" -#include "llvm/Instructions.h" -#include "llvm/Module.h" -#include "llvm/Pass.h" -#include "llvm/PassManager.h" +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/ADT/StringExtras.h" +#include "llvm/Config/config.h" +#include "llvm/IR/CallingConv.h" +#include "llvm/IR/Constants.h" +#include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/InlineAsm.h" +#include "llvm/IR/Instruction.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/Module.h"  #include "llvm/MC/MCAsmInfo.h"  #include "llvm/MC/MCInstrInfo.h"  #include "llvm/MC/MCSubtargetInfo.h" -#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/Pass.h" +#include "llvm/PassManager.h"  #include "llvm/Support/CommandLine.h"  #include "llvm/Support/ErrorHandling.h"  #include "llvm/Support/FormattedStream.h"  #include "llvm/Support/TargetRegistry.h" -#include "llvm/ADT/StringExtras.h" -#include "llvm/Config/config.h"  #include <algorithm>  #include <cstdio>  #include <map> @@ -141,7 +141,7 @@ namespace {      std::string getCppName(const Value* val);      inline void printCppName(const Value* val); -    void printAttributes(const AttrListPtr &PAL, const std::string &name); +    void printAttributes(const AttributeSet &PAL, const std::string &name);      void printType(Type* Ty);      void printTypes(const Module* M); @@ -464,24 +464,25 @@ void CppWriter::printCppName(const Value* val) {    printEscapedString(getCppName(val));  } -void CppWriter::printAttributes(const AttrListPtr &PAL, +void CppWriter::printAttributes(const AttributeSet &PAL,                                  const std::string &name) { -  Out << "AttrListPtr " << name << "_PAL;"; +  Out << "AttributeSet " << name << "_PAL;";    nl(Out);    if (!PAL.isEmpty()) {      Out << '{'; in(); nl(Out); -    Out << "SmallVector<AttributeWithIndex, 4> Attrs;"; nl(Out); -    Out << "AttributeWithIndex PAWI;"; nl(Out); +    Out << "SmallVector<AttributeSet, 4> Attrs;"; nl(Out); +    Out << "AttributeSet PAS;"; in(); nl(Out);      for (unsigned i = 0; i < PAL.getNumSlots(); ++i) { -      unsigned index = PAL.getSlot(i).Index; -      AttrBuilder attrs(PAL.getSlot(i).Attrs); -      Out << "PAWI.Index = " << index << "U;\n"; -      Out << " {\n    AttrBuilder B;\n"; - -#define HANDLE_ATTR(X)                                     \ -      if (attrs.hasAttribute(Attributes::X))               \ -        Out << "    B.addAttribute(Attributes::" #X ");\n"; \ -      attrs.removeAttribute(Attributes::X); +      unsigned index = PAL.getSlotIndex(i); +      AttrBuilder attrs(PAL.getSlotAttributes(i), index); +      Out << "{"; in(); nl(Out); +      Out << "AttrBuilder B;"; nl(Out); + +#define HANDLE_ATTR(X)                                                  \ +      if (attrs.contains(Attribute::X)) {                               \ +        Out << "B.addAttribute(Attribute::" #X ");"; nl(Out);           \ +        attrs.removeAttribute(Attribute::X);                            \ +      }        HANDLE_ATTR(SExt);        HANDLE_ATTR(ZExt); @@ -499,6 +500,7 @@ void CppWriter::printAttributes(const AttrListPtr &PAL,        HANDLE_ATTR(OptimizeForSize);        HANDLE_ATTR(StackProtect);        HANDLE_ATTR(StackProtectReq); +      HANDLE_ATTR(StackProtectStrong);        HANDLE_ATTR(NoCapture);        HANDLE_ATTR(NoRedZone);        HANDLE_ATTR(NoImplicitFloat); @@ -509,16 +511,24 @@ void CppWriter::printAttributes(const AttrListPtr &PAL,        HANDLE_ATTR(NonLazyBind);        HANDLE_ATTR(MinSize);  #undef HANDLE_ATTR -      if (attrs.hasAttribute(Attributes::StackAlignment)) -        Out << "    B.addStackAlignmentAttr(" << attrs.getStackAlignment() << ")\n"; -      attrs.removeAttribute(Attributes::StackAlignment); -      assert(!attrs.hasAttributes() && "Unhandled attribute!"); -      Out << "    PAWI.Attrs = Attributes::get(mod->getContext(), B);\n }"; -      nl(Out); -      Out << "Attrs.push_back(PAWI);"; + +      if (attrs.contains(Attribute::StackAlignment)) { +        Out << "B.addStackAlignmentAttr(" << attrs.getStackAlignment()<<')'; +        nl(Out); +        attrs.removeAttribute(Attribute::StackAlignment); +      } + +      Out << "PAS = AttributeSet::get(mod->getContext(), "; +      if (index == ~0U) +        Out << "~0U,"; +      else +        Out << index << "U,"; +      Out << " B);"; out(); nl(Out); +      Out << "}"; out(); nl(Out);        nl(Out); +      Out << "Attrs.push_back(PAS);"; nl(Out);      } -    Out << name << "_PAL = AttrListPtr::get(mod->getContext(), Attrs);"; +    Out << name << "_PAL = AttributeSet::get(mod->getContext(), Attrs);";      nl(Out);      out(); nl(Out);      Out << '}'; nl(Out); @@ -1888,23 +1898,24 @@ void CppWriter::printModuleBody() {  void CppWriter::printProgram(const std::string& fname,                               const std::string& mName) { -  Out << "#include <llvm/LLVMContext.h>\n"; -  Out << "#include <llvm/Module.h>\n"; -  Out << "#include <llvm/DerivedTypes.h>\n"; -  Out << "#include <llvm/Constants.h>\n"; -  Out << "#include <llvm/GlobalVariable.h>\n"; -  Out << "#include <llvm/Function.h>\n"; -  Out << "#include <llvm/CallingConv.h>\n"; -  Out << "#include <llvm/BasicBlock.h>\n"; -  Out << "#include <llvm/Instructions.h>\n"; -  Out << "#include <llvm/InlineAsm.h>\n"; -  Out << "#include <llvm/Support/FormattedStream.h>\n"; -  Out << "#include <llvm/Support/MathExtras.h>\n";    Out << "#include <llvm/Pass.h>\n";    Out << "#include <llvm/PassManager.h>\n"; +    Out << "#include <llvm/ADT/SmallVector.h>\n";    Out << "#include <llvm/Analysis/Verifier.h>\n";    Out << "#include <llvm/Assembly/PrintModulePass.h>\n"; +  Out << "#include <llvm/IR/BasicBlock.h>\n"; +  Out << "#include <llvm/IR/CallingConv.h>\n"; +  Out << "#include <llvm/IR/Constants.h>\n"; +  Out << "#include <llvm/IR/DerivedTypes.h>\n"; +  Out << "#include <llvm/IR/Function.h>\n"; +  Out << "#include <llvm/IR/GlobalVariable.h>\n"; +  Out << "#include <llvm/IR/InlineAsm.h>\n"; +  Out << "#include <llvm/IR/Instructions.h>\n"; +  Out << "#include <llvm/IR/LLVMContext.h>\n"; +  Out << "#include <llvm/IR/Module.h>\n"; +  Out << "#include <llvm/Support/FormattedStream.h>\n"; +  Out << "#include <llvm/Support/MathExtras.h>\n";    Out << "#include <algorithm>\n";    Out << "using namespace llvm;\n\n";    Out << "Module* " << fname << "();\n\n"; @@ -1941,14 +1952,6 @@ void CppWriter::printModule(const std::string& fname,    }    nl(Out); -  // Loop over the dependent libraries and emit them. -  Module::lib_iterator LI = TheModule->lib_begin(); -  Module::lib_iterator LE = TheModule->lib_end(); -  while (LI != LE) { -    Out << "mod->addLibrary(\"" << *LI << "\");"; -    nl(Out); -    ++LI; -  }    printModuleBody();    nl(Out) << "return mod;";    nl(Out,-1) << "}";  | 
