I'm not sure about the implementation of glm::mat4, but it is not set up in a way that puts the data within it on a complete 'word' location within memory or it was created in a misaligned location (you reading from a file? Doing some pointer arithmetic tricks somewhere?)
http://virtrev.blogspot.com/2010/09/memory-alignment-theory-and-c-examples.html
If you want a hack to 'get it working' you can try:
void Shader::setUniform(std::string name, const glm::mat4 value){
// This assumes your copy constructor works correctly
glm::mat4 alignedMat = value;
GLint uniform = glGetUniformLocation(m_program, name.c_str());
glUniformMatrix4fv(uniform, 1, GL_FALSE, (GLfloat*)&value);
}
I have used this trick to force align data before. You can also do a memcpy into alignedMat to force align things at times. DO NOT ASSUME this is the right way to do it. You should be creating elements with proper alignment. It's merely for seeing what is out of alignment, testing, and debugging.
Also if you ARE using the __declspec modifier on the parameter in the method definition. Don't.