From cf7ff2b4c8c18d67aced9d7ba84482819b38a84b Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Wed, 18 Oct 2006 02:21:12 +0000 Subject: [PATCH] Add support for the new "target data" information in .ll files. This provides a better encoding of the targets data layout, rather than trying to guess it from the endianness and pointersize like before. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31030 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Module.h | 8 ++++++++ lib/AsmParser/Lexer.l | 1 + lib/AsmParser/llvmAsmParser.y | 6 ++++++ lib/VMCore/AsmWriter.cpp | 3 +++ 4 files changed, 18 insertions(+) diff --git a/include/llvm/Module.h b/include/llvm/Module.h index 8e8f554abe3..195c73d2f44 100644 --- a/include/llvm/Module.h +++ b/include/llvm/Module.h @@ -116,6 +116,11 @@ public: /// @returns the module identifier as a string const std::string &getModuleIdentifier() const { return ModuleID; } + /// Get the data layout string for the module's target platform. This encodes + /// the type sizes and alignments expected by this module. + /// @returns the data layout as a string + std::string getDataLayout() const { return DataLayout; } + /// Get the target triple which is a string describing the target host. /// @returns a string containing the target triple. const std::string &getTargetTriple() const { return TargetTriple; } @@ -139,6 +144,9 @@ public: /// Set the module identifier. void setModuleIdentifier(const std::string &ID) { ModuleID = ID; } + /// Set the data layout + void setDataLayout(std::string DL) { DataLayout = DL; } + /// Set the target triple. void setTargetTriple(const std::string &T) { TargetTriple = T; } diff --git a/lib/AsmParser/Lexer.l b/lib/AsmParser/Lexer.l index 635318c40ce..af61a679fb1 100644 --- a/lib/AsmParser/Lexer.l +++ b/lib/AsmParser/Lexer.l @@ -210,6 +210,7 @@ triple { return TRIPLE; } deplibs { return DEPLIBS; } endian { return ENDIAN; } pointersize { return POINTERSIZE; } +data { return DATA; } little { return LITTLE; } big { return BIG; } volatile { return VOLATILE; } diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y index e57ca4ca5d4..2842f27f1b8 100644 --- a/lib/AsmParser/llvmAsmParser.y +++ b/lib/AsmParser/llvmAsmParser.y @@ -1068,6 +1068,7 @@ Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) { %token DEPLIBS CALL TAIL ASM_TOK MODULE SIDEEFFECT %token CC_TOK CCC_TOK CSRETCC_TOK FASTCC_TOK COLDCC_TOK %token X86_STDCALLCC_TOK X86_FASTCALLCC_TOK +%token DATA %type OptCallingConv // Basic Block Terminating Operators @@ -1873,6 +1874,11 @@ TargetDefinition : ENDIAN '=' BigOrLittle { free($3); CHECK_FOR_ERROR }; + | DATA '=' STRINGCONSTANT { + CurModule.CurrentModule->setDataLayout($3); + free($3); + CHECK_FOR_ERROR + }; LibrariesDefinition : '[' LibList ']'; diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp index 6b08266c312..aedb2c4040e 100644 --- a/lib/VMCore/AsmWriter.cpp +++ b/lib/VMCore/AsmWriter.cpp @@ -781,6 +781,9 @@ void AssemblyWriter::printModule(const Module *M) { M->getModuleIdentifier().find('\n') == std::string::npos) Out << "; ModuleID = '" << M->getModuleIdentifier() << "'\n"; + if (!M->getDataLayout().empty()) + Out << "target data = \"" << M->getDataLayout() << "\"\n"; + switch (M->getEndianness()) { case Module::LittleEndian: Out << "target endian = little\n"; break; case Module::BigEndian: Out << "target endian = big\n"; break;