From b26bc7fddcec7ee0f903573138e99f73dc561062 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 29 Mar 2017 19:26:26 +0000 Subject: [PATCH] Add ifunc support to ModuleSymbolTable. Do that by creating a global_values, which is similar to global_objects, but also iterates over aliases and ifuncs. llvm-svn: 299018 --- llvm/include/llvm/IR/Module.h | 26 ++++++++++++++++++++++++++ llvm/lib/Object/ModuleSymbolTable.cpp | 6 +----- llvm/test/Object/X86/nm-ir.ll | 3 +++ 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/llvm/include/llvm/IR/Module.h b/llvm/include/llvm/IR/Module.h index de10b09..a2c6462 100644 --- a/llvm/include/llvm/IR/Module.h +++ b/llvm/include/llvm/IR/Module.h @@ -617,6 +617,32 @@ public: return global_objects().end(); } + typedef concat_iterator + global_value_iterator; + typedef concat_iterator + const_global_value_iterator; + + iterator_range global_values() { + return concat(functions(), globals(), aliases(), ifuncs()); + } + iterator_range global_values() const { + return concat(functions(), globals(), aliases(), + ifuncs()); + } + + global_value_iterator global_value_begin() { return global_values().begin(); } + global_value_iterator global_value_end() { return global_values().end(); } + + const_global_value_iterator global_value_begin() const { + return global_values().begin(); + } + const_global_value_iterator global_value_end() const { + return global_values().end(); + } + /// @} /// @name Named Metadata Iteration /// @{ diff --git a/llvm/lib/Object/ModuleSymbolTable.cpp b/llvm/lib/Object/ModuleSymbolTable.cpp index 21709b5..9a935d8 100644 --- a/llvm/lib/Object/ModuleSymbolTable.cpp +++ b/llvm/lib/Object/ModuleSymbolTable.cpp @@ -43,12 +43,8 @@ void ModuleSymbolTable::addModule(Module *M) { else FirstMod = M; - for (Function &F : *M) - SymTab.push_back(&F); - for (GlobalVariable &GV : M->globals()) + for (GlobalValue &GV : M->global_values()) SymTab.push_back(&GV); - for (GlobalAlias &GA : M->aliases()) - SymTab.push_back(&GA); CollectAsmSymbols(*M, [this](StringRef Name, BasicSymbolRef::Flags Flags) { SymTab.push_back(new (AsmSymbols.Allocate()) AsmSymbol(Name, Flags)); diff --git a/llvm/test/Object/X86/nm-ir.ll b/llvm/test/Object/X86/nm-ir.ll index 1742a8f..29f7a5c 100644 --- a/llvm/test/Object/X86/nm-ir.ll +++ b/llvm/test/Object/X86/nm-ir.ll @@ -12,6 +12,7 @@ ; CHECK-NEXT: C g3 ; CHECK-NOT: g4 ; CHECK-NEXT: T global_asm_sym +; CHECK-NEXT: D ifunc_f1 ; CHECK-NEXT: t local_asm_sym ; CHECK-NEXT: U undef_asm_sy @@ -36,6 +37,8 @@ define void @f1() { ret void } +@ifunc_f1 = ifunc void (), void ()* @f1 + define internal void @f2() { ret void } -- 2.7.4